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
如果这是不可能的,有没有办法得到我想要的结果?
希望清楚地解释清楚......
问题在于这些列表并不完全相同。它正在比较分组的相等性,并且您有两个新的List<string>s,它们并不完全相等。但是,您可以通过哈希码连接字符串,这将产生正确的结果:
tests.GroupBy(t => String.Join(string.Empty, t.Children.Select(c => c.GetHashCode().ToString())));
Run Code Online (Sandbox Code Playgroud)