我想将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
语句会产生语法错误
什么是最佳做法?
答案 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);
}
如果您很幸运,您甚至可能会发现ModelRemoveUsers
有AddRange
方法,那么您根本不需要循环:
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
没有值)。另外,两个值都需要类似的类型。