私は持っていList<KeyValuePair<string, othertype>>
ます。私はの線に沿って何かをする必要があります
list.Find(x=>x.Key=="foobar")
しかし、それがリストに存在しない場合、どのような動作になるでしょうか? 通常は null を返しますが、構造体を null にすることはできません。
私のアドバイスは、FindIndex
null 非許容型に使用することです
int index = list.FindIndex(x => x.Key == "foobar");
if (index >= 0) {
// found!
UseResult(list[index]);
}
が成功しなかった場合、デフォルト値default(T)
が返されますFind()
。null 非許容型の場合、この結果はデフォルト値を持つ通常のエントリと区別できません。null
これは、リストに通常のエントリが含まれている可能性がある場合、null 許容型にも当てはまります。
default(T)
これはと同じnew KeyValuePair<string, othertype>>()
、つまりデフォルトの初期化された構造体 を返します。
基本的に、参照型のデフォルトは常にnull
であり、値型 ( を含むstruct
) の場合はデフォルトです (0
数値、false
for bool
、struct
すべてのフィールドが構造体のデフォルトの a など)。
したがって、 a の場合、が( のデフォルト) であり、 が何であれ(上記の例のように) default(KeyValuePair<string, othertype>>)
、KVP が返されます...Key
null
string
default(othertype)
MSDNから:
指定された述語によって定義された条件に一致する最初の要素が見つかった場合。それ以外の場合は、型 T の既定値。
これを使用して、 が返されたかどうかを確認したい場合はdefault
、 を確認して結果が得られたかどうかを確認することをお勧めします。または、Olivier が提案するような別の方法yourResult.Key != null
を使用することもできます。Find
FindIndex
構造体は値型です。そのため、構造体の場合、Find は構造体のデフォルト値を返します。
例:
以下のような構造があるとしましょう。
public struct Test
{
public int i;
}
List<Test> list = new List<test>() { new Test { i = 1 } };
Test result = list.Find(o => o.i == 2);
上記の結果の値は new Test() のように検索されます。以下のコードで値を比較できます。
if (resul.Equals(new Test()))
{
//Do something
}
else
{
//Do something
}
また
if (resul.Equals(default(Test)))
{
//Do something
}
else
{
//Do something
}
これらの2つのドキュメント記事を読むと、構造体のデフォルト値が返されるように思えます。
デフォルト値: http: //msdn.microsoft.com/en-us/library/aa664475 (v = vs.71).aspx
List(T).Findメソッド: http ://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx