对列表中的每个元素进行计数

本文关键字:元素 列表 | 更新日期: 2023-09-27 18:17:09

我有一个问题,看起来应该是真的很简单,但令人惊讶的是,我不能想出一个很好的解决方案。也许我错过了一些明显的东西。

我有一个对象列表,我希望循环多次,对其进行测试,并统计这些对象在测试中满足标准的次数,如下所示:

var tallies = new List<Tuple<object, int>>();
foreach (var talliedObject in myObjects) {
    // Initialize
    tallies.add(new Tuple<object, int>(talliedObject, 0));
}
while (...) {
    updateTallies(tallies, stuffToCheckAgainst);
}

但问题是,我不能只说thisTuple.Item2++来增加我的计数,因为Tuple的值是不可复制的。KeyValuePair的值也是。显然,这都是设计出来的,因为"可变结构是邪恶的"。为什么在这种情况下它们是邪恶的?我真的需要创建一个自定义类来存储我的对象和一个可以修改的关联整数吗?

对列表中的每个元素进行计数

您可以用一个新的Tuple实例替换(使用增量计数)或使用不同的结构。

例如,使用字典:

var tallies = new Dictionary<object, int>();
foreach (var talliedObject in myObjects) {
    // Initialize
    tallies.add(talliedObject, 0);
}
while (...) {
    tallies[object] = tallies[object] + 1;
}

最后我自己写了一个计数类:

/// <summary>
/// A class to keep a tally of a certain item for.
/// </summary>
/// <typeparam name="T">The type of the item to keep a tally for.</typeparam>
public class Tally<T> {
    public Tally(T initialTallyItem, ulong initialCountValue = 0) {
        this.Item = initialTallyItem;
        this.Count = initialCountValue;
    }
    public T Item { get; set; }
    public ulong Count { get; set; }
}

然后像这样使用:

var validObjectTallies = new List<Tally<MyObject>>();
foreach (MyObject obj in myObjects) {
    validObjectTallies.Add(new Tally<MyObject>(obj));
}
foreach (var data in dataEntries) {
    foreach (var tally in validObjectTallies) {
        // Logic to check whether to increment tally... if we should increment:
        tally.Count++;
    }
}