如何传递字典值而不必在 C# 中使用循环进行迭代

How to pass dictionary values without having to iterate using a loop in c#

我正在使用字典 class 如下

Dictionary<string, string> dict = new Dictionary<string, string>()
{
   {"1", "One"} 
   {"2", "Two"}
   {"3", "three"}
   {"4", "four"}
};

现在我试图获取每个键的值并将它们作为参数传递给函数。像 :

myFunction(<get the first key and pass its value as parameter>);
myFunction(<get the second key and pass its value as parameter>);
myFunction(<get the third key and pass its value as parameter>);
myFunction(<get the fourth key and pass its value as parameter>);

所以这是对函数的四次调用。

显然我不能在这里使用 for 循环,因为如果我这样做,比如说我从 1 开始循环,那么循环的第一个 运行 的值将是 1,它会选择在我不想要的函数的这四个调用中调出第一个键。我想在函数的第一次调用中获得 1,在第二次调用中获得第二个值,依此类推。

我想不出办法来做到这一点。任何建议都会有很大帮助。

您可以使用此代码获取密钥,

List<string> keyList = new List<string>(dict.Keys);

然后传递给带有索引的函数,

 myFunction(keyList[0]);

字典 无序 你真正需要知道的事。说你想要 "first" 键是没有意义的。当然,您可以将从字典的 Keys 属性 中获得的 KeyCollection 转换为 List<string>,但这可能导致任意不同的顺序。

如果 "first" 键表示键“1”,"second" 键表示键“2”等等,那么我认为 List<string> 更适合这个。它是有序的,您可以使用数字来访问元素。

此外,我不明白为什么 for 循环不起作用。试试这个:

for (int i = 1 ; i <= 4 ; i++) {
    myFunction(dict[i.toString()]);
}

这将按 "One" -> "Two" -> "three" -> "four".

的顺序传递值

为什么不能使用循环? foreach 对你好吗:

foreach (string key in dict.Keys)
{
    myFunction(dict[key]);
}

四次调用同一个键?

或者怎么不做循环

I cannot use a for loop here obviously because if I do so, say for example I start the loop from 1, then the value for the first run of the loop will be 1 and it will pick up the first key throughout these four calls of the function which I do not want. I want to get 1 in the first call of the functions, get second value in the second call and so on.

不要将这四个调用放在循环中。

如果您这样做:

var keys = new List<string>(dict.Keys);
for (var index = 0; index < keys.Count; index++)
{
    myFunction(dict[keys[index]]);
    myFunction(dict[keys[index]]);
    myFunction(dict[keys[index]]);
    myFunction(dict[keys[index]]);
}

或者这个:

var values = new List<string>(dict.Values);
for (var index = 0; index < values.Count; index++)
{
    myFunction(values[index]);
    myFunction(values[index]);
    myFunction(values[index]);
    myFunction(values[index]);
}

或者这个:

foreach (var key in dict.Keys)
{
    myFunction(dict[key]);
    myFunction(dict[key]);
    myFunction(dict[key]);
    myFunction(dict[key]);
}

或者这个:

foreach (var pair in dict)
{
    myFunction(pair.Value);
    myFunction(pair.Value);
    myFunction(pair.Value);
    myFunction(pair.Value);
}

或者这个:

foreach (var value in dict.Values)
{
    myFunction(value);
    myFunction(value);
    myFunction(value);
    myFunction(value);
}

您将得到 hte 函数 myFunction 被调用四次,每个值都使用相同的值。


如何做 for 或 foreach 循环

相反,将单个调用放入循环中。请记住,循环是用来重复某事的,所以将它放在循环中,它就会被重复。

所以这样做:

var keys = new List<string>(dict.Keys);
for (var index = 0; index < keys.Count; index++)
{
    myFunction(dict[keys[index]]);
}

所以这样做:

var values = new List<string>(dict.Values);
for (var index = 0; index < values.Count; index++)
{
    myFunction(values[index]);
}

或者这个:

foreach (var key in dict.Keys)
{
    myFunction(dict[key]);
}

或者这个:

foreach (var pair in dict)
{
    myFunction(pair.Value);
}

或者这个:

foreach (var value in dict.Values)
{
    myFunction(value);
}

您也可以这样做:

var keys = new List<string>(dict.Keys);
keys.ForEach(key => myFunction(dict[key]));

或者这个:

var values = new List<string>(dict.Values);
values.ForEach(value => myFunction(value));

或者,如果您更喜欢在混合中加入一些 Linq(我认为是这样,因为您添加了 Linq 标记),您可以这样做:

dict.Keys.ToList().ForEach(key => myFunction(dict[key]));

这也有效:

dict.Values.ToList().ForEach(value => myFunction(value));

如何做 while 循环

假设您根本不想执行 for 或 foreach 循环。好吧,让我们看看...

像这样的 for 循环:

var keys = new List<string>(dict.Keys);
for (var index = 0; index < keys.Count; index++)
{
    myFunction(dict[keys[index]]);
}

可以这样做:

var keys = new List<string>(dict.Keys);
var index = 0;
while (index < keys.Count)
{
    myFunction(dict[keys[index]]);
    index++
}

还有一个像这样的 foreach 循环:

foreach (var key in dict.Keys)
{
    myFunction(dict[key]);
}

可以这样做:

var enumerator = dict.Keys.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        var key = enumerator.Current;
        myFunction(dict[key]);
    }
}
finally
{
    enumerator.Dispose();
}

当然你也可以这样做:

var enumerator = dict.Values.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        var value = enumerator.Current;
        myFunction(value);
    }
}
finally
{
    enumerator.Dispose();
}

或者像这样:

var enumerator = dict.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        var pair = enumerator.Current;
        myFunction(pair.Value);
    }
}
finally
{
    enumerator.Dispose();
}

此转换类似于编译器在内部执行的转换。通过这样做,您在某些情况下可能会有更大的灵活性……但是,它也更容易出错。


如何不做循环

假设您根本不想循环。如果您在编译时知道元素的数量,这是可能的。我们可以通过展开一个for来到达那里,例如我们之前的while

var keys = new List<string>(dict.Keys);
var index = 0;
while (index < keys.Count)
{
    myFunction(dict[keys[index]]);
    index++
}

while 变成 if 并重复。结果如下所示:

var keys = new List<string>(dict.Keys);
var index = 0;
if (index < keys.Count)
{
    myFunction(dict[keys[index]]);
    index++
}
if (index < keys.Count)
{
    myFunction(dict[keys[index]]);
    index++
}
if (index < keys.Count)
{
    myFunction(dict[keys[index]]);
    index++
}
if (index < keys.Count)
{
    myFunction(dict[keys[index]]);
    index++
}

好吧,如果知道 index 的值和字典中的项目数,我们就知道 index < keys.Count 何时为真。所以我们可以删除那些 if 语句并用它们的内部代码替换它们(因为它们是真的)。我们最终得到这个:

var keys = new List<string>(dict.Keys);
var index = 0;
myFunction(dict[keys[index]]);
index = 1;
myFunction(dict[keys[index]]);
index = 2;
myFunction(dict[keys[index]]);
index = 3;
myFunction(dict[keys[index]]);
index = 4;

最后,我们内联索引变量:

var keys = new List<string>(dict.Keys);
myFunction(dict[keys[0]]);
myFunction(dict[keys[1]]);
myFunction(dict[keys[2]]);
myFunction(dict[keys[3]]);

哒哒!没有循环。

当然你也可以这样做:

var values = new List<string>(dict.Values);
myFunction(values[0]);
myFunction(values[1]);
myFunction(values[2]);
myFunction(values[3]);
foreach(var item in dict)
{
  myFunction(item.Value);
}

foreach(var dictValue in dict.Values)
{
  myFunction(dictValue);
}

不确定为什么您认为循环在这里不起作用