将值赋给键类型为<;元组<;int,int>;C#

将值赋给键类型为<;元组<;int,int>;C#,c#,dictionary,tuples,key-value,C#,Dictionary,Tuples,Key Value,我正在编写代码来生成一个网格,该网格应该是一个图形编辑器。网格值包含在字典中。这是我生成dictionary对象的方法,让您了解我正在处理的内容 public Dictionary<Tuple<int, int>, string> GenerateTable(int _x, int _y) { int total = _x * _y; var grid = new Dictionary<Tuple<

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

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
        }
公共字典生成表(int\u x,int\u y)
{
整数总计=x*y;
var grid=new Dictionary();/!以后可能需要此功能!

对于(int i=1;i更新

根据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;

这应该可以做到。因为你的
元组是字典的一个键,你只能有一个像素和一组
(x,y)
坐标,因此,不需要迭代整个表。

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


我知道这条线很旧,但使用新的C#7,您可以执行以下操作:

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

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

你到底是什么意思?
dict[Tuple.Create(1,2)]=value
应该有用吗?@knittl我只想更改字典中的一个元素。但是因为我的字典是Tuple,string,我不知道键入什么来访问它的键。你用一个Tuple访问它,正如我在上面的评论中所写的,这个版本只是将
字典
作为键/值对的
IEnumerable
,这将丢失快速查找属性。作为记录,我编写了一个lambda表达式来查看它的工作原理。我使用了犬儒主义的解决方案,因为我不想在已经有坐标的情况下遍历整个集合。@nickgowdy明白了。Avner是对的,但关于我的解决方案。注意到了。感谢您的代码起到了很大的作用。第二行是另一行,我想给dictionary[key]赋值。我不知道我必须创建tuple,这是我不知道的。只要确保
key
已经存在于表中,以防表稀疏。“结构可比性”在这里并不真正相关。相关信息是
Tuple
覆盖
Equals
GetHashCode
并提供一个坐标方式的实现。这与“结构等式”实现的行为相同。“可比”例如,如果您想要一个
SortedDictionary
,这件事可能是相关的。
var key = Tuple.Create(x, y);
var value = dictionary[key];
var grid = new Dictionary<ValueTuple<int, int>, string>();

grid.Add((1,1),"value");
string value=grid[(1,1)];