2

私は構造を持っています、

public struct Test
{
    public int int1;
    public string str;
}

そして私のコードでは、

List<Test> list = new List<Test>()
{ 
    new Test(){ int1 =1, str="abc" }, 
    new Test(){ int1 =2, str="abc" }
};

検索条件でSingleOrDefaultを使用しようとすると、List<Test> listint1の値が3になります。

Test result = list.SingleOrDefault(o => o.int1 == 3);

ここで、結果にはデフォルト値の値があります。これは、int1=0およびstr=nullを意味します。ここではnull、検索条件が満たされない場合の値が必要です。誰かが私を指摘しますどうすればこれを行うことができますか?

4

4 に答える 4

5

Testは構造体であり、値型であるため、nullは返されません。クラスに変更Testすると、nullが返されます。

于 2012-09-11T13:19:06.953 に答える
5

値型はnull許容ではないため、クラスまたはnull許容を使用する必要がありますTest?

ただし、を使用したい場合は、空の値をチェックするためにstruct呼び出される静的フィールドを作成する必要があります。Empty

public struct Test
{
    public static readonly Test Emtpy = new Test();
    public int int1;
    public string str;

    public static bool operator ==(Test a, Test b)
    {
        return a.int1 == b.int1 && Equals(a.str, b.str);
    }

    public static bool operator !=(Test a, Test b)
    {
        return !(a==b);
    }
}

これは、.NetFramework全体で見られる規則です。後でnull(おそらく何をするか)を確認したい場合は、Test.Empty代わりに確認してください。

List<Test> list = new List<Test>(){ new Test(){ int1 =1,str="abc"}, new Test(){ int1 =2,str="abc"}};
Test result = list.SingleOrDefault(o => o.int1 == 3);

if (result != Test.Emtpy)
    ...
于 2012-09-11T13:32:10.423 に答える
4

汚い修正:

    Test result = list.FirstOrDefault(o => o.int1 == 3);

    if (result.Equals(default(Test)))
    {
        // not found
    }
    else
    {
        // normal work
    }

これは、元のリストにデフォルトの構造体が含まれていないことが確実な場合にのみ使用してください(new Test(){int1 = 0、str = null})

于 2012-09-11T13:48:16.227 に答える
0
Test? result = list.Select(o => (?Test)o).SingleOrDefault(o => o.Value.int1 == 3);

それはきれいではありませんが、それはその仕事をします。そのパターンをヘルパーメソッドに抽出することをお勧めします。

于 2012-09-11T13:19:13.133 に答える