如何区分和计算列表框中的重复项?

时间:2019-03-27 19:33:15

标签: c#

我正在尝试创建一个列表框,可以在其中使用datagridview向其中添加项目,但问题是我想确定哪些项目重复并且重复多少次。

  • item1
  • item1
  • item2
  • item2
  • item2
  

输出item1 = 2,item2 = 3


这是我尝试过的显示最后重复的项目

int count = 0;

 for (int i = 0; i < listBox1.Items.Count; i++)
 {
  var s = listBox1.Items[i].ToString();
  if (s.StartsWith(listfood))
   {
    if (s == listfood)
     {
      ++count;
     }             
   }
 }
MessageBox.Show(count.ToString());

3 个答案:

答案 0 :(得分:2)

尝试

var duplicateItems = listBox1.Items.GroupBy(x => x.ToString())
            .Where(x => x.Count() > 1)
            .Select(x => new { Value = x.Key, Count = x.Count() })
            .ToList();

答案 1 :(得分:2)

using System.Linq;

// ...

var duplicates = listBox1.Items.GroupBy(x => x)
                               .Where(g => g.Count() > 1)
                               .Select(y => new { ItemName = y.Key, Occurrences = y.Count() })
                               .ToList();

foreach (var duplicate in duplicates)
    MessageBox.Show($"{duplicate.ItemName}: {duplicate.Occurrences}");

此解决方案使用LINQ来查询listBox1的{​​{1}}集合,并过滤掉我们不需要的任何数据。

首先,我们使用GroupBy对项目进行排序。然后,Where将过滤出集合中仅存在一次的所有项目。 Select允许我们将过滤后的集合中剩余的项目“投影”为“新表单”(我们使用带有ItemsItemName属性的anonymous type来跟踪重复项的名称及其在集合中出现的次数。

最后,ToListOccurrences列表IEnumerable<string> to a ToList type.重复is optional depending on how you plan on using ToList . In fact, my example doesn't need to call foreach because a转换集合IEnumerable`集合。

答案 2 :(得分:0)

我知道上面的答案肯定会起作用,但是我无法理解并使其起作用。这对我有用,我将listbox的值传输到一个数组并检查该数组中的重复项。

     var list = new List<string>();
            foreach(var item in listBox1.Items)
            {
                list.Add(item.ToString());
            }
            var r = from b in list
                    group b by b into g
                    let count = g.Count()
                    orderby count descending
                    select new { Value = g.Key, Count = count };
            foreach(var x in q)
            {
                MessageBox.Show("value: " + b.Value + " Count:" + b.Count);
            }

Found my answer here