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

时间:2013-06-06 14:46:07

标签: c# tuples immutability

我有一个问题似乎应该非常简单,但令人惊讶的是我无法找到一个好的解决方案。也许我错过了一些明显的东西。

我有一个对象列表,我希望循环多次,测试并计算对象在我的测试中满足条件的次数,如下所示:

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++来增加我的计数,因为元组的值是不可能的。这是一个KeyValuePair的值。显然这完全是设计因为“可变的结构是邪恶的”。为什么他们在这种情况下是邪恶的?我是否真的必须创建一个自定义类来存储我的对象以及我可以实际修改的相关整数?

2 个答案:

答案 0 :(得分:1)

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

例如,使用字典:

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

答案 1 :(得分:-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++;
    }
}