将值赋给key类型为
本文关键字:int Tuple 类型 key | 更新日期: 2023-09-27 18:15:00
我编写代码来生成一个网格,它应该是一个图形编辑器。网格值被包含在字典中。这是我生成字典对象的方法,让你了解我在做什么。
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
类型是"结构可比"的。这意味着要访问以1为键的字典中的值,您需要创建一个元组的新实例,并以您认为合适的任何方式(indexer, TryGetValue
等)访问该值。
var key = Tuple.Create(x, y);
var value = dictionary[key];
我知道这个线程是旧的,但是有了新的c# 7,你可以这样做:
var grid = new Dictionary<ValueTuple<int, int>, string>();
grid.Add((1,1),"value");
则可以使用:
string value=grid[(1,1)];
UPDATE
根据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)
坐标,因此,没有必要迭代整个表。
本文关键字:int Tuple 类型 key | 更新日期: 2023-09-27 18:15:00
我编写代码来生成一个网格,它应该是一个图形编辑器。网格值被包含在字典中。这是我生成字典对象的方法,让你了解我在做什么。
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
类型是"结构可比"的。这意味着要访问以1为键的字典中的值,您需要创建一个元组的新实例,并以您认为合适的任何方式(indexer, TryGetValue
等)访问该值。
var key = Tuple.Create(x, y);
var value = dictionary[key];
我知道这个线程是旧的,但是有了新的c# 7,你可以这样做:
var grid = new Dictionary<ValueTuple<int, int>, string>();
grid.Add((1,1),"value");
则可以使用:
string value=grid[(1,1)];
UPDATE
根据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)
坐标,因此,没有必要迭代整个表。