在具有特定值的字典中获取第一个KeyValuePair

时间:2012-12-11 19:26:21

标签: c# .net dictionary iteration key-value

我正在用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字节的起始偏移量。然后我将修改后的字符串写回该位置。很抱歉在原帖中省略了这一点。

4 个答案:

答案 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;
相关问题