Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Linq的可枚举组字段?_Linq - Fatal编程技术网

使用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());