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

運が良ければModelRemoveUsersAddRangeメソッドがあることに気付くかもしれませんが、ループはまったく必要ありません。

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、1行にすることができます

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

しかし、Mark Byers の非 1 行バージョンの方が読みやすく、長期にわたって維持しやすいため、私はそれを好みます。

于 2012-07-12T10:49:48.963 に答える
2

continue条件演算子内では使用できません。

条件演算子の 2 つの「ブランチ」は、同じ型または相互に暗黙的に変換できる型を返す必要があります。

于 2012-07-12T10:48:46.197 に答える
2

いいえ、それらは等しくありません。条件演算子 ( ? :) では、2 つの結果部分が最終的に値になる必要があります ( には値continueがありません)。さらに、両方の値が同様のタイプである必要があります。

于 2012-07-12T10:49:00.440 に答える