繁体   English   中英

用匿名类型声明列表

[英]Declaring list with anonymous type

我正在尝试声明具有匿名类型的列表。 我尝试将列表值分配为null,还尝试将列表分配给新实体列表,但显示错误。 有指针吗?

var finalEntries = new List<MyDbTableEntity>();

var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new { name = k.name.ToString(), data = k.info.ToString() })
                      .GroupBy(k => k.name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

错误

cannot convert from 
'System.Collections.Generic.List<System.Linq.IGrouping<string, <anonymous type: string name, string data>>>' 
to 
'System.Collections.Generic.IEnumerable<MyDbTableEntity>'

它不起作用,因为您有MyDbTableEntity的类型化列表。 您不能在此类型列表中添加其他类型。 尝试定义正确的类型?

var finalEntries = new List<MyDbTableEntity>();

var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new MyDbTableEntity { Name = k.name.ToString(), Data = k.info.ToString() })
                      .GroupBy(k => k.Name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

或将其更改为object列表。

var finalEntries = new List<object>();

// not sure about your type
var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new { name = k.name.ToString(), data = k.info.ToString() })
                      .GroupBy(k => k.name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

重要提示 :问题是当您失去此作用域时,将不会得到类型化的匿名类型,我的意思是,您将需要使用一些工件来读取属性,例如:使用reflection将类型转换为dictionary

在此示例中, Select().GroupBy().ToList()本质上返回列表列表。 顶级列表包含GroupBy()创建的所有组,而第二级列表包含从Select()方法返回的每个组的行。 这些是匿名类型的对象,与MyDbTableEntity完全不同

组列表和匿名类型的对象都不能转换为MyDbTableEntity类型。 为了说明我的意思,如果删除了Select()语句(以及匿名类型),则可以将最后一行更改为以下内容,它将起作用:

foreach(var items in groupedItemList) finalEntries.AddRange(items);

当然,这首先破坏了分组的目的,但确实显示了原始代码为何无效的一个方面。 第二个方面是通过删除Select()语句来演示的

这是我的意思的示例:

    class Person {
        public string FirstName;
        public string LastName;
        public Person(string firstName, string lastName) {
            FirstName = firstName;
            LastName = lastName;
        }
    }

    Person[] people = {
        new Person("Fred", "Bloggs"),
        new Person("Linda", "Bloggs"),
        new Person("Joe", "Bloe"),
        new Person("Jane", "Bloe"),
        new Person("Fred", "Flinstone")};

    public void Test() {
        List<Person> list = new List<Person>();     

        // This works   
        var peopleGroupedByLastName = people.GroupBy(k => k.LastName).ToList();
        foreach(var grp in peopleGroupedByLastName) {
            // The grp var holds a list of Person objects, each with the same last name
            list.AddRange(grp); // Pointless, but works
        }

        // The following will not even compile because the anonymous typed objects are
        // not compatible with Person objects, despite having exactly the same fields
        var peopleGroupedByLastName2 = people
            .Select(k => new { FirstName = k.FirstName, LastName = k.LastName })
            .GroupBy(k => k.LastName)
            .ToList();
        foreach(var grp in peopleGroupedByLastName2)
            list.AddRange(grp); // Not "Person" objects
    }
var finalEntries = Enumerable.Empty<MyDbTableEntity>()
                      .Select(k => new MyDbTableEntity { Name = k.name.ToString(), Data = k.info.ToString() })
                      .GroupBy(k => k.Name)
                      .ToList();

var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new MyDbTableEntity { Name = k.name.ToString(), Data = k.info.ToString() })
                      .GroupBy(k => k.Name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

http://rextester.com/KNLMR37736

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM