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

时间:2012-07-12 10:46:03

标签: c# .net

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

为什么我能这样做:

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

但不是这样:

foreach (string item in lstModelUsers.Items)
    string.IsNullOrEmpty(item)
        ? continue
        : Options.Default.ModelRemoveUsers.Add(item);

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

4 个答案:

答案 0 :(得分:8)

您不能像这样使用conditional operator。它只接受表达式作为其操作数。您的代码无法编译,因为continue只能用作语句,而不能用作表达式。

更好的方法是否定if表达式,这样就不需要continue

foreach (string item in lstModelUsers.Items)
{
    if (!string.IsNullOrEmpty(item))
    { 
        Options.Default.ModelRemoveUsers.Add(item);              
    }
}

您也可以使用Where

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

foreach (string item in itemsToAdd)
{
    Options.Default.ModelRemoveUsers.Add(item);   
}

如果您很幸运,您甚至可能会发现ModelRemoveUsersAddRange方法,那么您根本不需要循环:

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

Options.Default.ModelRemoveUsers.AddRange(itemsToAdd);

答案 1 :(得分:3)

我使用LINQ:

foreach (string item in lstModelUsers.Items.Where(user => !string.IsNullOrEmpty(user))
{
    Options.Default.ModelRemoveUsers.Add(item);
} 

根据ModelRemoveUsers的类型,您可以将其划分为一行

Options.Default.ModelRemoveUsers.AddRange(
    lstModelUsers.Items.Where(user => !string.IsNullOrEmpty(user));

但我更喜欢Mark Byers非单行版本,因为它更具可读性,因此随着时间的推移更容易维护。

答案 2 :(得分:2)

您不能在条件运算符中使用continue

条件运算符的两个“分支”需要返回可以隐式转换为彼此的相同类型。

答案 3 :(得分:1)

不,他们并不平等。条件运算符(? :)要求两个结果部分以值结束(continue没有值)。另外,两个值都需要类似的类型。