C# 使用元组列表:计算项数

C# 使用元组列表:计算项数,c#,tuples,C#,Tuples,我有以下处理元组的代码。输入是项目列表,输出是元组列表,我们基本上需要计算每个日期的项目数 List<Tuple<DateTime, int>> list = new List<Tuple<DateTime, int>>(); foreach (ItemClass item in items) { foreach(Tuple<DateTime, int> tuple in list) { if (tup

我有以下处理元组的代码。输入是项目列表,输出是元组列表,我们基本上需要计算每个日期的项目数

List<Tuple<DateTime, int>> list = new List<Tuple<DateTime, int>>();
foreach (ItemClass item in items)
{
    foreach(Tuple<DateTime, int> tuple in list)
    {
         if (tuple.Item1 == item.date)
         {
              tuple.Item2++;
              continue;
          }
    }
    list.Add(Tuple.Create<DateTime, int>(item.date, 1)); 
}
List List=新列表();
foreach(items中的ItemClass项)
{
foreach(列表中的元组)
{
if(tuple.Item1==item.date)
{
tuple.Item2++;
继续;
}
}
添加(Tuple.Create(item.date,1));
}
此代码当前未编译,因为
Item2
是只读的,问题是如何使其工作


早些时候,这对
字典
有效,但我不得不将其删除,因为外部代码不能使用
字典
,元组不适用于需要可变性的场景。您可以创建自己的类,该类将
DateTime
与可变整数计数器组合在一起,但也可以使用LINQ,将其转换为末尾的元组列表:

var list = items
    .GroupBy(item => item.date)
    .Select(g => Tuple.Create(g.Key, g.Count()))
    .ToList();

上面的代码为每个日期创建一个组,然后仅当每个组中项目的最终计数已知时才生成元组。

尝试使用Linq、
GroupBy()
按日期分组,然后使用
Select()
为每个组创建一个元组,最后使用
ToList()
转换为列表。差不多

var result = items.GroupBy(x => x.Date)
                  .Select(x => Tuple.Create(x.Key, x.Count()))
                  .ToList();

我假设,因为它是只读的,它已经有了一个属性,我想我以前用过tuple,所以是的,它可能有

也许你不能编辑它,因为你可以在Foreach()循环中编辑迭代器,也许你可以尝试另一种循环


将item2对象设置为当前循环之外的对象,并使用该对象而不是迭代器。

您正在创建一个新的元组列表,然后迭代一个空集合?那没有任何意义。什么是
tu.date
,这是从哪里来的?元组在设计上是不可变的,所以用字典(或列表)重写它。你不能引入一个带有DateTime属性和int属性的新类吗?这样不仅可以解决不变性问题,还可以获得更可读的代码。@YuvalItzchakov这是一个打印错误的项目。日期,现已修复,项目不是空集合,并且在执行此函数期间填充了元组。您忘了将
列表
赋值。