C# Linq groupby列表匹配和计数
我有一行json,我将其反序列化并创建列表列表:C# Linq groupby列表匹配和计数,c#,json,linq,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 有什么建议吗?您可以根据列表项按相同顺
var json = @"[{'names': ['a','b']} ,{'names': ['z','y','j']} ,{'names':
['a','b']}]";
var json_converted = JsonConvert.DeserializeObject<List<RootObject>>(json);
var namelist = json_converted
有什么建议吗?您可以根据列表项按相同顺序生成的
字符串对其进行分组。假设名称中不允许使用“|”
字符,则可以执行以下操作:
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()。用作组中所有元素的Name
名称的顺序可能不同。您可以为名称列表编写一个比较器
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;
}
}
谢谢正是我需要的!
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;
}
}
var namelist = json_converted.GroupBy(n => n.names, new NamesComparer())
.Select(i => new { name = i.Key, Count = i.Count() });