我列出了包含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;
答案 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?
什么时候应该使用词典?
简单地说,当您通过某个唯一键进行查找时,可以读取/修改与该键对应的对象(可能是它自己的集合)。一个快速的谷歌将显示你的大量用途。