C# 使用GroupBy()时如何从select as 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

我希望能够获得与使用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; }

        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();