将值赋值为Dictionary,其键类型为<tuple <int,int> C#</tuple <int,int>

时间:2014-07-27 17:09:16

标签: c# dictionary tuples key-value

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

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);

        }

有没有人知道如何通过访问类型元组中的键来更改字典中的元素?

3 个答案:

答案 0 :(得分:4)

Tuple类型在结构上具有可比性&#34;。这意味着要访问由一个键控的字典中的值,您可以创建一个新的元组实例,并以您认为合适的方式访问该值(索引器,TryGetValue等。)。

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

答案 1 :(得分:4)

我知道这个帖子已经老了,但是对于新的C#7你可以做类似的事情:

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

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

然后您可以使用以下方式阅读:

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

答案 2 :(得分:-1)

<强>更新

根据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<int, int>是字典中的关键字,因此您只能拥有一个带有(x, y)坐标集的像素,因此,无需遍历整个表格。