[英]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.