2

我想将 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

4 回答 4

8

你不能像那样使用条件运算符。它只接受表达式作为其操作数。您的代码无法编译,因为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);   
}

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

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

Options.Default.ModelRemoveUsers.AddRange(itemsToAdd);
于 2012-07-12T10:48:37.033 回答
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 非单行版本,因为它更具可读性,因此随着时间的推移更容易维护。

于 2012-07-12T10:49:48.963 回答
2

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

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

于 2012-07-12T10:48:46.197 回答
2

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

于 2012-07-12T10:49:00.440 回答