繁体   English   中英

Linq groupby 列表匹配和计数

[英]Linq groupby list matching and count

我有一行 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() });

有什么建议?

您可以按从以相同顺序获取的列表项生成的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"]["b", "a"]构造一个字符串"a|b" ,并使用该字符串对内容进行分组。

由于键由有序名称组成, g.First().names用作Name g.First().names对于该组的所有元素可能不会具有相同的顺序。

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

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() });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM