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