C# 使用GroupBy()时如何从select as foreach获得相同的结果
我希望能够获得与使用select方法和匿名方法时在分组上使用foreach相同的结果C# 使用GroupBy()时如何从select as foreach获得相同的结果,c#,linq,select,foreach,group-by,C#,Linq,Select,Foreach,Group By,我希望能够获得与使用select方法和匿名方法时在分组上使用foreach相同的结果 public class ExportData { public int Id { get; set; } public string Colour { get; set; } public string Name { get; set; } public int Age { get; set; } publ
public class ExportData
{
public int Id { get; set; }
public string Colour { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public int Money { get; set; }
}
public class ExportDataDictionary
{
public IDictionary<string, object> ColumnData { get; set; } = new Dictionary<string, object>();
}
然后,我通过分组中的每个组创建一个ExportDataDictionary和foreach列表,每次创建一个新的ExportDataDictionary,并将这两个键都添加到字典中
var data = new List<ExportDataDictionary>();
foreach (var grouping in dataGrouping)
{
var datadictionary = new ExportDataDictionary();
datadictionary.ColumnData.Add("NAME", grouping.Key.Name);
datadictionary.ColumnData.Add("AGE", grouping.Key.Age);
data.Add(datadictionary);
}
var data=newlist();
foreach(数据分组中的变量分组)
{
var datadictionary=new ExportDataDictionary();
datadictionary.ColumnData.Add(“NAME”,grouping.Key.NAME);
datadictionary.ColumnData.Add(“AGE”,grouping.Key.AGE);
data.Add(datadictionary);
}
结果是5个ExportDataDictionary的集合,每个字典中有2列,其中包含对应于每个分组的键对
下面显示了我使用Select方法实现相同目标的尝试
var data2 = new List<ExportDataDictionary>();
var mydata = dataGrouping.Select(d =>
{
var datadictionary = new ExportDataDictionary();
datadictionary.ColumnData.Add("NAME", d.Key.Name);
datadictionary.ColumnData.Add("AGE", d.Key.Age);
data2.Add(datadictionary);
return data2;
});
var data2=新列表();
var mydata=dataGrouping.Select(d=>
{
var datadictionary=new ExportDataDictionary();
datadictionary.ColumnData.Add(“NAME”,d.Key.NAME);
datadictionary.ColumnData.Add(“AGE”,d.Key.AGE);
data2.Add(datadictionary);
返回数据2;
});
结果为以下类型:
mydata = {System.Linq.Enumerable.WhereSelectEnumerableIterator<System.Linq.IGrouping<<>f__AnonymousType0<string, int>, ConsoleApp2.Program.ExportData>, System.Collections.Generic.List<ConsoleApp2.Program.ExportDataDictionary>>}
mydata={System.Linq.Enumerable.WhereSelectEnumerableIterator}
它包含5个条目,每个条目包含10本词典。我期望的5个字典与使用foreach时的值相同,但每个字典都有2个副本。我相信这一定是因为它正在为分组中使用的两个键创建字典。因此,我想知道如何只对其中一个密钥或集合中的每个组执行此操作
要求是mydata
应包含与foreach在data
变量中获得的结果相同的结果
非常感谢您的帮助:)只需在上一条语句末尾添加.ToList()
,删除data2.Add(datadictionary)
语句,只返回datadictionary返回datadictionary代码>像这样
var mydata = dataGrouping.Select(d =>
{
var datadictionary = new ExportDataDictionary();
datadictionary.ColumnData.Add("NAME", d.Key.Name);
datadictionary.ColumnData.Add("AGE", d.Key.Age);
return datadictionary;
}).ToList();
我已经运行了您的代码,检查并看到mydata
包含5个项目,每个项目包含2个ColumnData
成员
实际上,只有在调用.ToList()
函数时才会执行Linq查询谢谢您的帮助,不幸的是,它不会产生与foreach相同的结果。你是对的,mydata将包含5个项目,每个项目有5个字典,但这不是我想要的。我只想要5本有2列的字典。有人确实发布了一个解决方案,但由于某种原因,他们的帖子不久就被删除了——我需要的是返回datadictionary,而不是将其添加到data2并返回它!再次感谢-感谢您的帮助;)我已经根据要求修改了答案。
mydata = {System.Linq.Enumerable.WhereSelectEnumerableIterator<System.Linq.IGrouping<<>f__AnonymousType0<string, int>, ConsoleApp2.Program.ExportData>, System.Collections.Generic.List<ConsoleApp2.Program.ExportDataDictionary>>}
var mydata = dataGrouping.Select(d =>
{
var datadictionary = new ExportDataDictionary();
datadictionary.ColumnData.Add("NAME", d.Key.Name);
datadictionary.ColumnData.Add("AGE", d.Key.Age);
return datadictionary;
}).ToList();