15

私は持っていList<KeyValuePair<string, othertype>>ます。私はの線に沿って何かをする必要があります

list.Find(x=>x.Key=="foobar")

しかし、それがリストに存在しない場合、どのような動作になるでしょうか? 通常は null を返しますが、構造体を null にすることはできません。

4

4 に答える 4

18

私のアドバイスは、FindIndexnull 非許容型に使用することです

int index = list.FindIndex(x => x.Key == "foobar");
if (index >= 0) {
    // found!
    UseResult(list[index]);
}

が成功しなかった場合、デフォルト値default(T)が返されますFind()。null 非許容型の場合、この結果はデフォルト値を持つ通常のエントリと区別できません。nullこれは、リストに通常のエントリが含まれている可能性がある場合、null 許容型にも当てはまります。

于 2012-10-01T15:32:14.450 に答える
15

default(T)これはと同じnew KeyValuePair<string, othertype>>()、つまりデフォルトの初期化された構造体 を返します。

基本的に、参照型のデフォルトは常にnullであり、値型 ( を含むstruct) の場合はデフォルトです (0数値、falsefor boolstructすべてのフィールドが構造体のデフォルトの a など)。

したがって、 a の場合、が( のデフォルト) であり、 が何であれ(上記の例のように) default(KeyValuePair<string, othertype>>)、KVP が返されます...Keynullstringdefault(othertype)

MSDNから:

指定された述語によって定義された条件に一致する最初の要素が見つかった場合。それ以外の場合は、型 T の既定値。

これを使用して、 が返されたかどうかを確認したい場合はdefault、 を確認して結果が得られたかどうかを確認することをお勧めします。または、Olivier が提案するような別の方法yourResult.Key != nullを使用することもできます。FindFindIndex

于 2012-10-01T15:26:04.833 に答える
3

構造体は値型です。そのため、構造体の場合、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    
 }
于 2012-10-01T15:32:44.093 に答える
1

これらの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

于 2012-10-01T15:27:49.037 に答える