List <tuple>没有setter错误

时间:2016-05-12 06:12:06

标签: c# list tuples

我列出了包含int和string的元组,每次我在这个列表中添加新位置时,我都会在已经添加的元素中检查相同的字符串。一旦我看到相同的 - 目标是改变int(做+1)。例如,如果我们有(3,box; 1,apple; 2,PC)并且我们需要添加“apple”,那么我必须将现有的“1,apple”更改为“2,apple”。 但我不能这样做因为Item1返回错误“该属性没有setter”。 我的错误在哪里? 感谢。

        string[] elements = s.Split(); // Contains all elements as strings.

        List<Tuple<int, string>> elementsList = new List<Tuple<int, string>>();

        var sortItems = elementsList.OrderBy(x => x.Item1);

        for (int i = 0; i < elements.Length; i++)
        {
            foreach (var item in sortItems)
            {
                if (Equals(item.Item1, elements[i]))
                {
                    item.Item1 += 1;
                }
            }
            elementsList.Add(new Tuple<int, string>(1, elements[i]));
        }         
        return elementsList;

4 个答案:

答案 0 :(得分:9)

根据Tuple<T1,T2>的{​​{3}},无法编写属性,这基本上意味着元组是不可变的。不可能就地修改其内容;有必要创建一个新的元组。

答案 1 :(得分:1)

Tuple<T1, T2>不允许您修改内部值,因为它是不可变的。而是尝试使用Dictionary

string[] elements = s.Split(); // Contains all elements as strings.

IDictionary<string, int> elementsMap = new Dictionary<string, int>();

for (int i = 0; i < elements.Length; i++)
{
    string name = elements[i];

    if (elementsMap.ContainsKey(name))
    {
        elementsMap[name] += 1;
    }
    else
    {
        elementsMap.Add(name, 1);
    }
}
return elementsMap;

或通过Linq(归功于Jeppe Stig Nielsen):

var elementsMap = elements.GroupBy(e => e).ToDictionary(g => g.Key, g => g.Count());

答案 2 :(得分:1)

元组是不可变类型,所以基本上它们并不打算被改变而且没有setter。这里列出了原因:Why Tuple's items are ReadOnly?

您要么创建一个新元组(如Codor建议的那样),要么您只是创建自己的实现,如下所示:Why a Tuple, or a KeyValueItem, don't have a setter?

答案 3 :(得分:0)

元组类是不可变的,这意味着它的属性没有公共setter来覆盖基础值。

元组并不意味着以键值方式使用,这可能更接近于您想要实现的目标。元组更适合配对 - 它们实际上可以用于2个以上 - 两个相关的数据,例如坐标,或宽度和高度。

以下链接答案中的更多示例:

Practical example where Tuple can be used in .Net 4.0?

什么时候应该使用词典?

简单地说,当您通过某个唯一键进行查找时,可以读取/修改与该键对应的对象(可能是它自己的集合)。一个快速的谷歌将显示你的大量用途。