2016-01-22 1 views
5

今私のコードは次のようになります。一つの要素は、必要に応じてを追加してC#コレクションイニシャライザ - 条件に基づいてオプションで要素を追加できますか?

var ids = projectId.HasValue ? new List<Guid> { projectId.Value } : new List<Guid>(); 

は、1行のコードでリストを作成するより簡潔な方法は、ありますか?

+0

リストをラップし、内部に条件付きでAdd(T)メソッドをオーバーロードすることを検討します。 – MaLiN2223

+7

おそらくあなたができる最高の1つのステートメントです。これをたくさん行う場合、nullableからコレクションを作成するための拡張メソッドを追加することができます。 – Lee

+0

@拡張メソッドは実際には悪い考えのようには聞こえません。 –

答えて

1

は、これはおそらく良いアイデアではありませんが、in C# 6, collection initializers also work when Add() is an extension method

public static void Add<T>(this List<T> list, T? item) where T : struct 
{ 
    if (item.HasValue) 
    { 
     list.Add(item.Value); 
    } 
} 

そして、このコードは、あなたがやりたいだろう:

これは、あなたがこのような拡張Add()を書くことができることを意味し(これが唯一の値型のために働くことを

var list = new List<Guid> { projectId }; 

注ので、 T/T?の区別があります)、参照型で使用するための簡単な方法はありません。

また、上記の行は非常に驚くべきことですが、より簡潔であるということは必ずしも良いとは限りません。だから私は実際にこのコードを使用しませんでした。

+0

ありがとう!そして今、私はそれについて考えました、あなたが正しいのは、短くても必ずしも良いというわけではありません。 –

+0

書いた人が私の会社で働いていたら、私は自分のホッチキスでそれらを打ち負かすでしょう。 –

+0

@JoeEnosそれは良いことではないと言って二度はあなたのために十分ではありませんか? :-) – svick

1

かなり簡潔だが、別のオプションは、LINQを使用することです:それはこのように使うことができるよりも

public static void AddIfNotNull<T>(this List<T> list, T? value) where T : struct 
{ 
    if(value != null) 
    { 
     list.Add(value.Value); 
    } 
} 

:私はこのような拡張メソッドを使用して、これを解決するだろう

var ids = new[] { projectId }.Where(x => x.HasValue).Select(x => x.Value).ToList(); 
+4

これはほぼ同じ長さであり、コードの意図を隠しています。 –

+0

@ YacoubMassadすべてのバイト数は正しいですか?:) –

+0

おそらく2文字を保存しましたが、プロジェクトでこのコードを読んでいると、何か複雑なクエリがあると思います。私は元の意図を理解しません。 –

2

var ids = new List<Guid>(); 
ids.AddIfNotNull(projectId); 

たぶんとして「狡猾」(とないワンライナー)あなたの提案として、私の意見ではないこと読んで理解するのがはるかに簡単です。 1ライナーとして使用する場合は、拡張子の戻り値の型をリストに変更することができます。それはあなたが拡張メソッドルートをつもりなら、それはのようなものを見ているでしょうvar ids = new List<Guid>().AddIfNotNull(projectId);

+1

'T'は' Guid'だから 'projectId'は' Guid? 'なのでこれはコンパイルされません。もしあなたが拡張メソッドを作るつもりなら、あなたは望む振る舞い、すなわち関数 'T? - >リスト '。 – Lee

+0

@Lee良い点 –

0

のようなものを使用することが可能になるだろう:

public static void AddIfNotNull<T>(this List<T> list, T? value) 
    where T : struct 
{ 
    if (value.HasValue) 
    { 
     list.Add(value.Value); 
    } 
} 

あなたは第2の延長方法を構築する必要があると思います参照タイプ(where T : class)が必要な場合は参照してください。

2

拡張メソッドのためのもう一つのアイデア(名前は確実に向上することができ、多分PossiblyCreateSingletonList?):

public static class NullableExtensions 
{ 
    public static List<T> SingletonList<T>(this Nullable<T> item) where T : struct 
    { 
     return item.HasValue ? new List<T> { item.Value } : new List<T>(); 
    } 
} 

使用法:

Guid? projectId = null; 

List<Guid> projectIds = projectId.SingletonList(); // empty list 
関連する問題