在 ForEach 中循环,但变量是什么

Looping in ForEach, but what is the Variable

我有一个出现故障的日志记录应用程序,我正在控制台线上工作以测试我的代码。当我意识到因为我从 COnfigurationManager 获取信息时,我不知道我的 FOR Each 中的变量叫什么?

string machineNamesConfig = ConfigurationManager.AppSettings["MachineNames"];
var machineNames = new List<string>(machineNamesConfig.Split(','));
machineNames = machineNames.OrderBy(i => i).ToList();
foreach (??? m in machineNames)
{

}

试试这个:

 foreach (var m in machineNames)
 {

 }

为了回答您的问题,变量名为 "m"。

您要查找的是变量的类型。您可以让编译器通过使用 var 来推断这一点,就像 Mike Schwartz 的回答一样。您还可以使用 string 因为您知道 machineNames 是一个字符串列表:

foreach (string m in machineNames)
{
    //...
}

foreach循环中声明的变量类型可以是var,也可以是你正在迭代的集合的元素类型,也可以是该元素类型的任意子类型。这样做可能没有充分的理由,但如果您愿意,也可以执行以下操作之一:

foreach (object m in machineNames) { }
foreach (IEnumerable<char> m in machineNames) { }

以此类推

您正在代码的第二行创建一个 List<string>,然后对其进行排序,然后再次创建一个列表。

之后,machineNames列表中对象的类型应该是string

无论如何,您也可以使用 var 而忘记类型,因为编译器会为您完成工作。

以下更好,更可取,因为即使您将对象分配给 var 变量 machineNames,它仍然是 string,因为您正在迭代字符串列表,只是您懒得定义适当的变量。另外,给人一种感觉,如果有人看你的代码,第一眼就知道你在迭代什么。

foreach (string m in machineNames)
 {

 }

以下也适用。

foreach (var m in machineNames)
 {

 }

快速说明: 使用 var 而不是 string 没有区别。它实际上只是一种编码风格。编译器为两种变体生成完全相同的结果。也没有性能差异。

您实际上可以将整个事情作为一个班轮完成:

foreach (var machineName in ConfigurationManager.AppSettings["MachineNames"].Split(',').OrderBy(i => i)) 
{

}

正如大家所建议的,var 可以与 string 互换。