for循环中的Inline if语句的最佳实践

Mar*_*aro 2 .net c#

我想将Listbox项目复制到StringCollection.如果列表框项目包含空字符串,则忽略

我为什么这样做:

foreach (string item in lstModelUsers.Items)
{
    if (string.IsNullOrEmpty(item))
        continue;
    else
        Options.Default.ModelRemoveUsers.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

但不是这样的:

foreach (string item in lstModelUsers.Items)
    string.IsNullOrEmpty(item)
        ? continue
        : Options.Default.ModelRemoveUsers.Add(item);
Run Code Online (Sandbox Code Playgroud)

虽然两者看起来都相等,但内联if语句会生成语法错误.
什么是最佳做法?

Mar*_*ers 8

你不能像这样使用条件运算符.它只接受表达式作为其操作数.您的代码无法编译,因为continue它只能用作语句而不能用作表达式.

更好的方法是否定if表达式,以便您不需要continue:

foreach (string item in lstModelUsers.Items)
{
    if (!string.IsNullOrEmpty(item))
    { 
        Options.Default.ModelRemoveUsers.Add(item);              
    }
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用Where:

var itemsToAdd = lstModelUsers.Items
    .Cast<string>()
    .Where(item => !string.IsNullOrEmpty(item));

foreach (string item in itemsToAdd)
{
    Options.Default.ModelRemoveUsers.Add(item);   
}
Run Code Online (Sandbox Code Playgroud)

如果你很幸运,你甚至可能发现它ModelRemoveUsers有一个AddRange方法,那么你根本就不需要循环:

var itemsToAdd = lstModelUsers.Items
    .Cast<string>()
    .Where(item => !string.IsNullOrEmpty(item));

Options.Default.ModelRemoveUsers.AddRange(itemsToAdd);
Run Code Online (Sandbox Code Playgroud)