Linq对象列表按多个属性相等分组

本文关键字:属性 对象 列表 Linq | 更新日期: 2023-09-27 18:28:52

我有一个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;

Linq对象列表按多个属性相等分组

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

从您的代码中,很明显,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
                                                      });

我认为像theList.GroupBy(x => x.Property1, x => x.Property2);这样的东西可以随心所欲。

相关文章: