Linq对象列表GroupBy多属性平等

时间:2013-08-23 18:29:09

标签: c# linq grouping

我有List<ReportObject>并且希望能够将列表中的某些元素组合成单个元素,这是基于一个元素与列表中第二个元素的某些其他属性匹配的某些属性的相等性。在这种情况下,我想用第二个元素的值更新第一个元素,然后返回一个只包含“第一个元素”集合的列表。

也许GroupBy(或者一般的LINQ)在这里不是正确的解决方案,但它似乎比传统的foreach循环和新的第二个列表更清晰。我想要的是这样的:

List<ReportObject> theList = new List<ReportObject>() 
                          { new ReportObject() { Property1 = "1", Property2 = "2" },
                            new ReportObject() { Property1 = "2", Property2 = "3" }
                            new ReportObject() { Property1 = "1", Property2 = "3" } };

List<ReportObject> newList = new List<ReportObject>();
for(int i = 0; i < theList.Count; i++)
{
    for(int j = i + 1; i < theList.Count; j++)
    {
       if (theList[i].Property1 == theList[j].Property2)
       {
           theList[i].Property2 = theList[j].Property2);
           newList.Add(theList[i]);

           theList.RemoveAt(j);
       }
    }
}

return newList;

3 个答案:

答案 0 :(得分:1)

var newList = theList.GroupBy(x => x.Property1).Select(g => g.First()).ToList();

答案 1 :(得分:0)

我觉得theList.GroupBy(x => x.Property1, x => x.Property2);之类的东西会做你想要的。

答案 2 :(得分:0)

从您的代码中,显然newList将包含Property1 = Property2的所有项目:

var newList = theList.SelectMany((x,i)=>
                                 theList.Where((y,j)=>j>i && y.Propery2 == x.Propery1)
                                        .Select(a=> new ReportObject{
                                                      Property1=x.Property1,
                                                      Property2=x.Property1
                                                      });