【问题标题】:Linq groupby list matching and countLinq groupby 列表匹配和计数
【发布时间】:2018-02-12 15:16:29
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: c# json linq


    【解决方案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"]["b", "a"] 构造一个字符串"a|b",并使用该字符串对内容进行分组。

    由于键是由有序名称组成的,因此用作 Nameg.First().names 对于组中的所有元素的顺序可能不同。

    【讨论】:

    • 谢谢!正是我需要的!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多