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

当我尝试在List<Test> list搜索条件下使用 SingleOrDefault 时,int1 值等于 3

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

这里的结果具有默认值,意味着 int1 = 0 和 str = null。null如果不满足搜索条件,我想要价值。任何人都指出我该怎么做?

4

4 回答 4

5

您不会返回 null,因为Test它是一个结构,一种值类型。更改Test为一个类,它将返回 null。

于 2012-09-11T13:19:06.953 回答
5

值类型不可为空,因此您要么必须使用类,要么使用可空的Test?

但是如果你想坚持使用 a 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);
    }
}

这是您可以在 .Net 框架中找到的约定。如果您以后想要检查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 回答