【问题标题】:Assign value into Dictionary that has a key type of <Tuple<int,int> C#将值分配给具有 <Tuple<int,int> C# 键类型的字典
【发布时间】:2014-09-18 22:35:07
【问题描述】:

我编写代码来生成一个应该是图形编辑器的网格。网格值包含在字典中。这是我生成字典对象的方法,让您了解我正在使用的内容。

public Dictionary<Tuple<int, int>, string> GenerateTable(int _x, int _y)
        {
            int total = _x * _y;
            var grid = new Dictionary<Tuple<int, int>, string>(); //!Might need this later!

            for (int i = 1; i <= _x; i++) // outer loop is column 
            {
                for (int ii = 1; ii <= _y; ii++) // Inner loop is row -
                {
                    grid.Add(Tuple.Create(i, ii), "O");
                }
            }
            return grid; // Should have same amount of elements as int total
        }

我有另一种方法,我想更改字典中的一个元素,因为我使用元组的键,我不知道在索引中提供什么来更改值。这是另一种方法。

 public void ColorPixel(Dictionary<Tuple<int, int>, string> _table, int _x, int _y, string _c)
        {
            foreach(var pixel in _table
                .Where(k => k.Key.Item1 == _x && k.Key.Item2 == _y))
            {

            }


            //var tbl = _table.
            //    Where(t => t.Key.Item1 == _x && t.Key.Item2 == _y)
            //    .Select(t => t.Value == _c);

        }

有谁知道我如何通过访问 Tuple 类型的键来更改字典中的元素?

【问题讨论】:

  • 你到底是什么意思? dict[Tuple.Create(1, 2)] = value 应该可以吗?
  • @knittl 我只是想更改字典中的元素之一。但是因为我的字典是 Tuple, string 我不知道输入什么来访问它的键。
  • 您可以使用元组访问它,正如我在上面的评论中所写的那样

标签: c# dictionary tuples key-value


【解决方案1】:

我知道这个线程是旧的,但是使用新的 C#7 你可以这样做:

var grid = new Dictionary<ValueTuple<int, int>, string>();

grid.Add((1,1),"value");

然后你可以使用:

string value=grid[(1,1)];

【讨论】:

    【解决方案2】:

    更新

    根据 Avner 的评论,您不应该以这种方式使用 Linq。这是一个典型的错误,通常是由于编写 Linq 语句相对容易造成的,但会极大地影响性能,尤其是字典。

    var keyToFind = Tuple.Create(_x, _y);
    string pixelValueToUpdate;
    _table.TryGetValue(keyTofind, out pixelValueToUpdate);
    if (pixelValueToUpdate != null)
        pixelValueToUpdate = "New Value";
    

    不要使用 LINQ

    var pixelValue = _table
        .Where(pixel => pixel.Key.Item1 == _x && pixel.Key.Item2 == _y)
        .FirstOrDefault(pixel => pixel.Value);
    pixelValue = "NewValue;
    

    应该这样做。由于您的 Tuple&lt;int, int&gt; 是字典的键,因此您只能有一个像素与一组 (x, y) 坐标,因此,无需遍历整个表。

    【讨论】:

    • 此版本只是将Dictionary 视为键/值对的IEnumerable,从而失去了快速查找属性。
    • 为了记录,我写了一个 lambda 表达式来看看它是如何工作的。我选择了 cynic 的解决方案,因为当我已经有了坐标时,我不想遍历整个集合。
    • @nickgowdy 明白了。 Avner 是对的,尽管关于我的解决方案。正式注明。
    【解决方案3】:

    Tuple 类型是“结构上可比较的”。这意味着要访问以 1 为键的字典中的值,您需要创建一个新的元组实例,并以任何您认为合适的方式访问该值(索引器、TryGetValue 等)。

    var key = Tuple.Create(x, y);
    var value = dictionary[key];
    

    【讨论】:

    • 感谢您的代码很有效。第二行是相反的,我想给字典[key]赋值。不知道我必须创建元组是我不知道的。
    • 只要确保key 已经存在于您的表中,以防您的表可能是稀疏的。
    • “结构可比性”在这里并不真正相关。相关信息是 Tuple&lt;,&gt; 覆盖 EqualsGetHashCode 并提供坐标实现。这与“structural equatable”实现的行为相同。例如,如果您想要SortedDictionary&lt;Tuple&lt;,&gt;,&gt;,“可比较”的东西可能是相关的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多