【问题标题】:Getting count of duplicate items in a List [closed]获取列表中重复项目的计数[关闭]
【发布时间】:2015-10-05 15:16:09
【问题描述】:

我正在尝试获取列表中最常见的重复项的计数。

到目前为止,我有:

List<string> brandList = new List<string>();

其中包含5不同的软饮料品牌,计数为100。我需要找出列表中重复次数最多的品牌,并计算重复次数。

【问题讨论】:

  • @cdslnte 他需要重复的数量,而不是不同的值。
  • 那不是 C# 或者至少不是编译
  • 这消除了重复,而不是我正在寻找的东西。不过还是谢谢..
  • 我投票结束这个问题,因为它不清楚 OP 真正需要什么。每一秒都有新的需求......

标签: c# winforms list count duplicates


【解决方案1】:

可能是这样的:

var res = brandList.GroupyBy(x => x)
    .Select(x => new {Key = x.Key, Count = x.Count});

现在您有一个包含实际饮料号码和该号码计数的列表。

编辑:现在很容易获得数量最多的品牌,例如通过使用:

var mostPopular = res.Single(x => x.Count == res.Max(y => y.Count)); 

EDIT2:如果没有 LINQ,以下可能会起作用,但会更长更复杂:

// get the count for every brand

Dictionary<string, int> res = new Dictionary<string, int>();
foreach(var x in brands)
{
    if (!res.ContainsKey(x)) res[x] = 0;
    res[x]++;
}

// now get the max count

int currentMax = 0;
string key = "";
foreach (var kv in res)
{
    if (kv.Value > currentMax)
    {
        currentMax = kv.Value;
        key = kv.Key;
    }
}

现在key 应该包含Count 最高的品牌。

【讨论】:

  • 你知道在c#中不用linq怎么做吗?
  • 您应该在问题中提到这一点。等几分钟……
  • 好的,我现在更新了我的答案。
  • 我什至不知道 linq 是什么,直到每个答案都写在里面,而你的第二个答案仍然不是用我想要的基本 c# 编码编写的
  • 当然可以,在没有 LINQ 的情况下也可以在 .NET 3.5(甚至是 2.0)上编译。那么你的错误是什么?
【解决方案2】:

您可以尝试使用 LINQ by Elements 进行分组并计算计数

var groupedList = from l in ListbrandList
    group l by l into grp
    select new { key = grp.Key, cnt = grp.Count()};

然后您将按键(元素)和值(计数)分组

【讨论】:

    【解决方案3】:

    假设你的伪代码实际上是:

    List<Brand> brandList=new List<Brand>();
    // fill list
    

    您的Brand 类要么覆盖Equals+getHashCode,要么具有类似BrandID 的属性,即标识符。现在你想获得最受欢迎品牌的数量,你可以使用 LINQ:

    var mostPopularBrand = brandList.GroupBy(b => g.BrandID)
        .OrderByDescending(g => g.Count())
        .Select(g => new { BrandID = g.Key, Count =  g.Count()})
        .First();
    
    Console.WriteLine("Most poular brand: {0} Count: {1}", 
                       mostPopularBrand.BrandID, mostPopularBrand.Count);
    

    更新:如果它实际上是List&lt;string&gt;(问题已编辑):

    var mostPopularBrand = brandList.GroupBy(str => str)
        .OrderByDescending(g => g.Count())
        .Select(g => new { Brand = g.Key, Count =  g.Count()})
        .First();
    

    【讨论】:

    • 那不适合视觉工作室?? :(
    • @chersharp:它适用于 C#。如果您至少使用 Visual Studio 2008(.NET 3.5),则可以使用 LINQ。
    • 我必须使用 windows 窗体应用程序,你认为你能告诉我如何在上面做吗?
    • @chersharp:我看不出它与 winform 有什么关系。该问题与 gui 控件无关。
    • 我的意思是编码格式,我必须用简单的方法而不是 Linq
    【解决方案4】:

    您的代码无法编译。假设您的意思是 List&lt;String&gt; 作为品牌存储:

      var ListbrandList = new List<String>() {
        "Cola",
        "Juice",
        "Cola",
        "Water",
        "Milk",
        "Water",
        "Cola",
      };
    
      var result = ListbrandList
        .GroupBy(item => item)
        .Select(item => new {
             Name = item.Key,
             Count = item.Count()
           })
        .OrderByDescending(item => item.Count)
        .ThenBy(item => item.Name);
    
      String report = String.Join(Environment.NewLine, result
        .Select(item => String.Format("{0} appears {1} time(s)", item.Name, item.Count)));
    

    您将拥有report

      Cola appears 3 time(s)
      Water appears 2 time(s)
      Juice appears 1 time(s)
      Milk appears 1 time(s)      
    

    【讨论】:

    • 这段代码不正确!!!!
    【解决方案5】:
    var result = brandList
                .Distinct()
                .GroupJoin(brand,
                k => k,
                b => b,
                (k, b) => new { BrandName = k, Count = b.Count() });
    
    // An usage could be...
    
    foreach (var r in result)
    {
        Debug.WriteLine("{0} Brand has {1}", r.BrandName, r.Count);
    }
    

    没有 LinQ:

    var result = new Dictionary<string, int>();
    
    foreach (var brand in brandList)
    {
        if (!result.ContainsKey(brand))
        {
            var count = brandList.FindAll(x => x.Equals(brand)).Count;
            result.Add(brand, count);
        }
    }
    
    foreach (var r in result)
    {
        Console.WriteLine("{0} Brand has {1}", r.Key, r.Value);
    }
    

    【讨论】:

    • 我正在使用 VISUAL STUDIO C# Windows 窗体应用程序......你如何计算一个项目在列表中出现的次数???????因为我还不知道其他形式的编码
    • 你必须在你的文件中包含这个:using System.Linq; 然后你将拥有 Count() 扩展方法。 Count(不带括号)是 List 类的属性。
    • 哦,好的,然后我就可以按照你说的输入?
    • 是的,我使用该代码没有问题。
    • 不使用linq的其他格式你知道吗?
    【解决方案6】:

    要计算列表中具有特定值的元素,请使用:

    int quantity = lst.Count(r => r == "Cola");
    

    例子:

    List<string> lst = new List<string>()
    {
        "Sprite",
        "Cola",
        "Sprite",
        "Sprite",
        "Cola",
        "Sprite",
        "Sprite",
        "Cola",
        "Pepsi",
        "Sprite",
        "Pepsi",
        "Sprite",
    
    };
    
    string[] popularBrands = { "Cola", "Pepsi" };
    
    int[] quantities = new int[popularBrands.Length];
    
    for (int i = 0; i < popularBrands.Length; i++)
    {
        quantities[i] = lst.Count(r => r.ToUpper() == popularBrands[i].ToUpper());
        Console.WriteLine("{0}  :   {1}", popularBrands[i], quantities[i]); 
    }
    

    输出

    Cola : 3
    Pepsi : 2
    

    附言

    关于此代码r =&gt; r.ToUpper() == popularBrands[i].ToUpper(): r 是一个变量,它保存我们列表中的一个值(一个接一个)。我们还使用 ToUpper() 来确保我们的检查不区分大小写。

    所以我们基本上循环遍历集合,一个一个地从中取出值。每次我们将值赋值给r 变量并检查该变量是否满足条件。如果是 - 我们计算它,如果不是 - 我们只是移动到下一个值。

    【讨论】:

    • r => r 是什么意思?
    • @chersharp r 是一个变量,其中包含从您的列表中一一获取的值。我更新了我的记录来解释它。
    • 感谢@Fabjan 这个“=>”是什么意思??
    猜你喜欢
    • 2015-06-25
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多