【问题标题】:c# how to get all unique combinations of a list of objects and their frequencyc#如何获取对象列表的所有唯一组合及其频率
【发布时间】:2019-10-01 15:56:51
【问题描述】:

因此,在 c# 中,我尝试对对象列表进行排序,以便获得每个唯一组合,并计算它们在列表中出现的频率。

我的这份清单如下:

    List<Numbers> nums = new List<Numbers>();

    public class Numbers
    {
        public int numOne { get; set; }
        public int numTwo { get; set; }
    }

    nums.Add(new Numbers { numOne = 1, numTwo = 2});
    nums.Add(new Numbers { numOne = 4, numTwo = 7});
    nums.Add(new Numbers { numOne = 1, numTwo = 2});

现在我想实现一个基本过滤“nums”列表的新列表,以便获得以下结果:

    1  |  2  -->  2
    4  |  7  -->  1

我一直在尝试使用 linq,但我似乎找不到达到预期结果的正确方法。

【问题讨论】:

  • “我一直在试验 linq” 你能告诉我们你到目前为止做了什么吗?
  • 检查这个docs.microsoft.com/en-us/dotnet/api/… 我引用“如果你想从一些自定义数据类型的对象序列中返回不同的元素,你必须在类中实现 IEquatable 通用接口。以下代码示例展示了如何在自定义数据类型中实现此接口"
  • 可以使用linqGroupBy方法
  • 如果你添加这个会是什么预期结果:nums.Add(new Numbers { numOne = 7, numTwo = 1});
  • @AleksAndreev 实现 IEquatable 随着编码的进步会更有帮助,迟早会证明更好。

标签: c# list filtering


【解决方案1】:

试试这个。使用 LINQ,您可以一次按 numOnenumTwo 对 nums 列表进行分组。然后,您可以通过选择满足 groupby 条件的 nums 列表中的值的Count 来选择属性并计算计数。然后,您可以按照您认为合适的方式使用它。我只是将它打印到控制台窗口并以与普通列表相同的方式访问属性。希望对您有所帮助。

var filtered = nums.GroupBy(n => new { n.numOne, n.numTwo })
                   .Select(x => new
                   {
                       x.Key.numOne,
                       x.Key.numTwo,
                       count = x.Count()
                   })
                   .ToList();

for (int i = 0; i < filtered.Count; i++)
    Console.WriteLine(string.Format("{0} | {1} --> {2}", 
                        filtered[i].numOne, 
                        filtered[i].numTwo, 
                        filtered[i].count));

【讨论】:

  • 您可以简化count 的计算。只需使用count = x.Count()
  • 好点。我会编辑那个。更容易阅读,可能更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2020-04-12
  • 2023-01-27
  • 2012-10-06
相关资源
最近更新 更多