C# 列表<;元组>;没有设置错误

C# 列表<;元组>;没有设置错误,c#,list,tuples,C#,List,Tuples,我已经列出了包含int和string的Tuple,每次我向这个列表添加新位置时,我都会在已经添加的元素中检查相同的字符串。一旦我看到相同的情况,目标就是改变int(to do+1)。例如,如果我们有(3,box;1,apple;2,PC),我们需要添加“apple”,那么我必须将现有的“1,apple”更改为“2,apple”。 但是我不能这样做,因为Item1返回错误“属性没有setter”。 我的错在哪里? 谢谢 string[]elements=s.Split();//以字符串形式包含所有

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

string[]elements=s.Split();//以字符串形式包含所有元素。
列表元素列表=新列表();
var sortItems=elementsList.OrderBy(x=>x.Item1);
for(int i=0;i
根据
元组的定义,属性无法写入,这基本上意味着元组是不可变的。无法就地修改其内容;必须创建一个新的元组。

元组
不允许修改其中的值,因为它是不可变的。相反,请尝试使用
词典

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;

元组是不可变的类型,因此基本上它们不打算更改,也没有setter。原因如下:


要么创建一个新的元组(如Codor所建议的),要么创建自己的实现,如图所示:

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

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

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

什么时候应该使用字典?


只需通过某个唯一键进行查找,即可读取/修改与该键对应的对象(它本身可能是一个集合)。在谷歌上快速搜索一下,你会发现大量的用法。

你必须使用
列表吗?我认为如果您使用
Dictionary
来实现此目的,您的代码会简单得多。一个更好的方法是
var list=elements.GroupBy(e=>e)。选择(g=>Tuple.Create(g.Count(),g.Key)).ToList()
或类似。同意@CoolBots comment,generic
Dictionary
正是您所需要的,因为它基于哈希表,因此在Dictionary中的搜索将比在
列表中的搜索快得多,或者在Linq的帮助下,使用
var elementsMap=elements.GroupBy(e=>e).ToDictionary(g=>g.Key,g=>g.Count())
@JeppeStigNielsen我已经在我的答案中添加了这一点,但是如果您需要代表,请随时提供另一个答案
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;
var elementsMap = elements.GroupBy(e => e).ToDictionary(g => g.Key, g => g.Count());