【问题标题】:List<Tuple> has no setter errorList<Tuple> 没有设置器错误
【发布时间】:2016-05-12 06:12:06
【问题描述】:

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

        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;

【问题讨论】:

  • 一定要使用List&lt;Tuple&lt;int, string&gt;&gt;吗?我认为如果您为此使用Dictionary&lt;string, int&gt;,您的代码会简单得多。
  • 一个更好的方法是var list = elements.GroupBy(e =&gt; e).Select(g =&gt; Tuple.Create(g.Count(), g. Key)).ToList(); 或类似的。
  • 同意@CoolBots 的评论,通用的Dictionary 正是你所需要的,因为它是基于哈希表的,因此在字典中的搜索会比在List 中快得多

标签: c# list tuples


【解决方案1】:

根据Tuple&lt;T1,T2&gt;documentation,属性是不能写的,基本上就是说元组是不可变的。无法就地修改其内容;有必要创建一个新的元组。

【讨论】:

    【解决方案2】:

    Tuple&lt;T1, T2&gt; 不允许你修改里面的值,因为它是不可变的。而是尝试使用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());
    

    【讨论】:

    • 或者借助Linq,使用var elementsMap = elements.GroupBy(e =&gt; e).ToDictionary(g =&gt; g.Key, g =&gt; g.Count());
    • @JeppeStigNielsen 我已将其添加到我的答案中,但如果您需要代表,请随时将其作为另一个答案提供
    【解决方案3】:

    元组是不可变的类型,所以基本上它们不会被更改并且没有设置器。原因在这里列出:Why Tuple's items are ReadOnly?

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      什么时候应该使用字典?

      仅当您通过某个唯一键进行查找以读取/修改与该键对应的对象(可能是它自己的集合)时。快速 google 一下会告诉你很多用途。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多