Linq groupby列表匹配和计数

时间:2018-02-12 15:16:29

标签: c# json linq

我有一行json,我反序列化并创建一个列表列表:

var json = @"[{'names': ['a','b']} ,{'names': ['z','y','j']} ,{'names': 
['a','b']}]";
var json_converted = JsonConvert.DeserializeObject<List<RootObject>>(json);
var namelist = json_converted

我想使用linq比较列表内容,看看列表中的项目是否与另一个列表相匹配

离)

名称............匹配列表计数

列出{a,b} = 2

列出{z,y,j} = 1

我尝试了以下内容,但没有骰子:/

 var namelist = json_converted
 .GroupBy(n => n.names)
 .Select(i => new { name = i.Key, Count = i.Count() });

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以按照以相同顺序拍摄的列表项目生成的string进行分组。假设名称中不允许'|'个字符,您可以这样做:

var namelist = json_converted
    .GroupBy(n => string.Join("|", n.names.OrderBy(s => s)))
    .Select(g => new {
        Name = g.First().names
    ,   Count = g.Count()
    });

此方法从列表"a|b"["a", "b"]构造字符串["b", "a"],并使用该字符串对内容进行分组。

由于密钥由有序名称组成,因此用作g.First().names的{​​{1}}对于该组的所有元素的顺序可能不同。

答案 1 :(得分:1)

您可以为名称列表编写比较器。

public class NamesComparer : IEqualityComparer<IEnumerable<string>>
{
    public bool Equals(IEnumerable<string> x, IEnumerable<string> y)
    {
        //do your null checks
        return x.SequenceEqual(y);
    }

    public int GetHashCode(IEnumerable<string> obj)
    {
        return 0;
    }
}

然后在GroupBy中使用它:

var namelist = json_converted.GroupBy(n => n.names, new NamesComparer())
                             .Select(i => new { name = i.Key, Count = i.Count() });