LINQ GroupBy系列

The*_*man 7 c# linq linq-to-objects

是否可以使用集合属性在LINQ中进行GroupBy?

例如

void Main()
{
    var t1 = new Test() { Children = new List<string>() { "one", "two" } };
    var t2 = new Test() { Children = new List<string>() { "one", "two" } };
    var t3 = new Test() { Children = new List<string>() { "one", "three" }        };

    var tests = new List<Test>() { t1, t2, t3 };
    var anon =  from t in tests
                select new
                {
                    Children = t.Children
                };

    anon.GroupBy(t => t.Children).Dump();
}

public class Test
{
    public List<string> Children {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我希望有两组:

键:List(){"one","two"}值:t1,t2

键:List(){"one","three"}值:t3

我的理解是,匿名类型不是通过引用进行比较,而是通过比较其公共属性的相等性.

但是,实际结果是三组:

键:List(){"one","two"}值:t1

键:List(){"one","two"}值:t2

键:List(){"one","three"}值:t3

如果这是不可能的,有没有办法得到我想要的结果?

希望清楚地解释清楚......

doc*_*ess 0

问题在于这些列表并不完全相同。它正在比较分组的相等性,并且您有两个新的List<string>s,它们并不完全相等。但是,您可以通过哈希码连接字符串,这将产生正确的结果:

tests.GroupBy(t => String.Join(string.Empty, t.Children.Select(c => c.GetHashCode().ToString())));
Run Code Online (Sandbox Code Playgroud)