我正在用C#/ .NET 4.5编写一个应用程序,我有一个像这样定义的字典:
Dictionary<int, string> d = new Dictionary<int, string>();
我的整数键是顺序且唯一的,除了空字符串之外,我的值也是唯一的。例如:
Key Value
0 AAAAAAAAAA
1 BBBBBB
2 (empty string)
3 CCCCCCCCCCCCCCCCCCCCCCCC
4 DDDDDDDDDDDDDDD
5 EEEEEEEEEEEEEEEEEEE
6 (empty string)
当我有一个要添加到字典的新字符串时,我需要将其分配给其中一个值为(空字符串)的键。理想情况下,我想在第一个这样的密钥的情况下这样做。我正在循环浏览我的字典:
int keyNumber;
foreach (KeyValuePair<int, string> pair in d)
{
if (pair.Value == string.Empty)
{
keyNumber = pair.Key;
break;
}
}
d[keyNumber] = "new string goes here!";
这有效,但有更好(或更快)的方法来完成同样的事情吗?如果这实际上是最好的方法,是否可以将其缩短为LINQ表达式?
EDIT ---------------------------------------------- -------------------------------
我遗漏了可能需要解释的重要事项。加载到我的字典中的值实际上是从包含ASCII字符串的固定长度字节数组的二进制文件加载的。该文件将始终包含5000000个字节或100000个字符串,每个字符串50个字节。文件结构由将使用该文件的设备上的某些硬件限制确定。因此,我的字典中每个KeyValuePair的键实际上用于确定文件的偏移量,在用户完成制作时我需要写入任何更改。例如,使用4的密钥,然后我乘以50到200字节的起始偏移量。然后我将修改后的字符串写回该位置。很抱歉在原帖中省略了这一点。
答案 0 :(得分:3)
d[d.FirstOrDefault(x => string.IsNullOrEmpty(x.Value)).Key] = "My String";
然而,字典实际上意味着存储真正的键值对。列表听起来更适合您的情况,因为您似乎只需要存储值。即便如此,列表元素仍然可以通过索引访问,并且您可以包含空元素,因此没有(根据您所说的)似乎是坚持使用字典的理由。
答案 1 :(得分:1)
Dictionary
可能不是您尝试做的最佳选择。尝试使用简单的List<>
或数组。
Dictionary
是将一个唯一值映射到另一个非唯一值的优化方法。如果你想做更多的事情,你最好实现自己的收藏。
答案 2 :(得分:1)
如果您知道将有一个空字符串值的条目,您可以使用:
var kvp = d.First(p => p.Value == string.Empty);
d[kvp.Key] = "new string goes here!";
答案 3 :(得分:1)
我不推荐它,正如评论所说,你应该使用一个列表。但这里有两个例子:
Dictionary<int, string> d = new Dictionary<int, string>();
string valueToBeInserted = "randomstring";
var keyValuePair = d.FirstOrDefault(c => c.Value == string.Empty);
d[keyValuePair.Key] = valueToBeInserted;
简化为:
Dictionary<int, string> d = new Dictionary<int, string>();
string valueToBeInserted = "randomstring";
d[d.FirstOrDefault(c => c.Value == string.Empty).Key] = valueToBeInserted;