获取字典中特定值的第一个键值对

3
我正在使用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表达式?
编辑--------------------------------------------------
我忘记了可能需要解释的重要内容。加载到我的字典中的值实际上是从由固定长度的字节数组组成的二进制文件中加载的,该文件包含ASCII字符串。文件总共将始终由5000000个字节或100000个总字符串@每个50个字节组成。文件结构是由将使用该文件的设备上的某些硬件限制确定的。因此,我的字典中每个KeyValuePair的键实际上用于确定我需要写入任何更改的文件中的偏移量。例如,使用键4,然后将其乘以50到200字节的起始偏移量。然后在该位置写回修改后的字符串。对于在原始帖子中省略此信息,我感到抱歉。

7
听起来你的键与值没有关系,而且顺序也不重要...那么为什么要使用“字典”呢?为什么不只使用一个“列表”,用索引作为你的“键”呢? - Dave Zych
我非常怀疑LINQ会更快。它还需要枚举和比较。所以你确定不会用尽string.Empty吗? - paparazzo
是的,string.Empty 可能会用完。文件大小是固定的,只能容纳 100,000 个 ASCII 编码的字符串,每个字符串占用 50 字节。如果没有 string.Empty 值,则用户必须通过删除一些现有数据来为更多数据腾出空间。尽管听起来很疯狂,但这是一个要求。 - bmt22033
感谢大家的评论和答案。你们的建议让我相信字典不是解决这个问题的正确答案,现在我将重构我的代码来使用列表。虽然我只能接受一个答案,但我已经给所有的评论和答案点赞了。再次感谢你们所有人! - bmt22033
如果你知道大小,我会选择数组而不是列表。 - paparazzo
显示剩余2条评论
4个回答

3
d[d.FirstOrDefault(x => string.IsNullOrEmpty(x.Value)).Key] = "My String";

然而,字典确实旨在存储真正的键值对。列表听起来更适合您的情况,因为似乎您只需要存储值。即使如此,列表元素仍然可以通过索引访问,您可以包含空元素,因此(从您所述的内容中)似乎没有理由坚持使用字典。

1

如果您知道将会有一个空字符串值的条目,您可以使用:

var kvp = d.First(p => p.Value == string.Empty);
d[kvp.Key] = "new string goes here!";

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;

Simplified:

 Dictionary<int, string> d = new Dictionary<int, string>();
 string valueToBeInserted = "randomstring";
 d[d.FirstOrDefault(c => c.Value == string.Empty).Key] = valueToBeInserted;

1
一个 Dictionary 可能不是你尝试做的最好选择。尝试使用一个简单的 List<> 或者数组。 Dictionary 是一种将一个唯一值映射到另一个非唯一值的优化方式。如果你想做更多的事情,最好实现自己的集合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接