使用linq在列表中不存在元素时返回值

时间:2011-08-01 04:50:07

标签: c# linq

我有以下代码,如果它存在于数组“arrayID”中,它将返回一个值。

string str = arrayID.Single(s => s == ((System.Data.DataRowView)(e.Item.DataItem)).Row["ID"].ToString());

我现在面临的问题是,当值不存在时,我会收到错误

  

序列不包含匹配元素

我希望返回一个空字符串,因为arrayID中不存在该值。

请告诉我如何在linq中完成。

提前致谢。

2 个答案:

答案 0 :(得分:6)

SingleOrDefault方法就是你所追求的。如果没有项目,它将返回默认值(null),因此您只需要另一个步骤将其转换为空:

string str = arrayID
    .SingleOrDefault(s => s == ((System.Data.DataRowView)(e.Item.DataItem)).Row["ID"].ToString())
        ?? string.Empty

答案 1 :(得分:4)

SingleOrDefault 中的默认值是指C#默认关键字。因此,当找不到任何内容时,将返回源值的默认值。

http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

所以请注意,值类型的默认值不会为null

例如:

        int[] list = { 1, 3, 7, 13,21};

        int v;
        try {
            v=list.Single(n => n > 15);
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }

        int? v2;
        v2 = list.SingleOrDefault(n => n > 30);
        Console.WriteLine(v2.ToString());
        // output: 0

        int v3;
        v3=list.SingleOrDefault(n => n > 30);            
        Console.WriteLine(v3.ToString());
        // output: 0

        string[] slist = {"a", "b", "c"};
        var v4 = slist.SingleOrDefault(s => s == "z");
        Console.WriteLine(v4==null);
        // output: true     <-- i.e. it is a reference type + it is nullable.