我正在尝试创建一个列表框,可以在其中使用datagridview向其中添加项目,但问题是我想确定哪些项目重复并且重复多少次。
输出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());
答案 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
允许我们将过滤后的集合中剩余的项目“投影”为“新表单”(我们使用带有Items
和ItemName
属性的anonymous type来跟踪重复项的名称及其在集合中出现的次数。
最后,ToList
从Occurrences
列表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);
}