2012-07-12 62 views
2

我想将Listbox项目复制到StringCollection。 如果列表框的项目中包含然后空字符串忽略For循环中的if语句的最佳实践

为什么我能做到这一点:

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语句生成语法错误。
最佳做法是什么?

+1

你为什么要这样做?为什么每个人都想做内联代码,这很可怕,而且没有任何用处。 – 2012-07-12 11:07:27

+0

一些公司有自己的编码指导,他们推荐内联代码,我认为其中一个好处就是减少代码量 – Maro 2012-07-12 12:28:17

回答

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); 
} 

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

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

Options.Default.ModelRemoveUsers.AddRange(itemsToAdd); 
+0

lstModelUsers是一个ListBox。 我不能使用lstModelUsers.Items.Where?我必须首先演员还是失去一些东西? – Maro 2012-07-12 12:44:31

+1

@Maro:是的,如果它是旧的WinForms列表框,它不会使用泛型。你需要给'Cast'添加一个调用。我已经更新了我的答案,以说明如何做到这一点。 – 2012-07-12 12:48:43

+0

非常感谢Mark! – Maro 2012-07-12 13:00:56

2

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

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

1

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

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)); 

但我更喜欢马克·拜尔斯非单行版本它更具可读性,因此随着时间的推移将更容易维护。