如何传递字典值而不必在 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);
}
不确定为什么您认为循环在这里不起作用
我正在使用字典 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);
}
不确定为什么您认为循环在这里不起作用