使用Linq的可枚举组字段?
我写过这样一句话:使用Linq的可枚举组字段?,linq,Linq,我写过这样一句话: var fs = list .GroupBy(i => new { X = i.X, Ps = i.Properties.Where(p => p.Key.Equals("m")) <<<<<<<<<<< } ) .Select(g => g.Key }); var fs=list .
var fs = list
.GroupBy(i =>
new {
X = i.X,
Ps = i.Properties.Where(p => p.Key.Equals("m")) <<<<<<<<<<<
}
)
.Select(g => g.Key });
var fs=list
.GroupBy(i=>
新{
X=i.X,
Ps=i.Properties.Where(p=>p.Key.Equals(“m”))分组在这里不起作用
分组时,运行时将尝试比较组键以生成正确的组。但是,由于在组键中使用了一个属性(Ps
),该属性对于列表中的每个项都是不同的IEnumerable
(比较是基于引用相等而不是序列相等)这将导致每个元素的集合不同;换句话说,如果您有两个项目:
var a = new { X = 1, Properties = new[] { "m" } };
var b = new { X = 1, Properties = new[] { "m" } };
GroupBy
子句将为您提供两个不同的键,如下图所示
如果您的目的只是将项目投影到GroupBy
键的结构中,那么您不需要分组;下面的查询应该给出相同的结果:
var fs = list.Select(item => new
{
item.X,
Ps = item.Properties.Where(p => p.Key == "m")
});
但是,如果确实要求结果是不同的,则需要为结果创建一个单独的类,并实现一个单独的to use with子句:
您使用哪些数据结构?什么是列表
,i
,X
,属性
?
public class Result
{
public int X { get; set; }
public IEnumerable<string> Ps { get; set; }
}
public class ResultComparer : IEqualityComparer<Result>
{
public bool Equals(Result a, Result b)
{
return a.X == b.X && a.Ps.SequenceEqual(b.Ps);
}
// Implement GetHashCode
}
var fs = list.Select(item => new Result
{
X = item.X,
Ps = item.Properties.Where( p => p.Key == "m")
}).Distinct(new ResultComparer());