我有一行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() });
有什么建议吗?
答案 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() });