0

我们使用以下代码片段根据 Name选择特定object的 from 。collectionproperty

        ObservableCollection<Test> collection = new ObservableCollection<Test>();
        collection.Add(new Test() { Id =1, Name ="Nestor"});
        collection.Add(new Test() { Id = 2, Name = "Rohan" });
        collection.Add(new Test() { Id = 3, Name = "Guy" });
        collection.Add(new Test() { Id = 4, Name = "Mike" });

        string s = "Rohan";
        var temp = collection.FirstOrDefault(x =>
            {
                if (x.Name != null)
                {
                    return x.Name.ToString().Equals(s);
                }
                else
                {
                    return x.Name;
                }
            });

我们在此代码段中收到以下错误。

错误:

错误 1 ​​无法将 lambda 表达式转换为委托类型“System.Func”,因为块中的某些返回类型不能隐式转换为委托返回类型 C:\Users\vadiviven\documents\visual studio 2010\Projects\WindowsFormsApplication12\WindowsFormsApplication12 \Program.cs 36 25 WindowsFormsApplication12 错误 2 无法将类型“字符串”隐式转换为“布尔”C:\Users\vadiviveln\documents\visual studio 2010\Projects\WindowsFormsApplication12\WindowsFormsApplication12\Program.cs 36 32 WindowsFormsApplication12

您能否对此进行调查并提供使用正确方法的建议Linq query。提前致谢。

修改后的代码如下:

        ObservableCollection<Test> collection = new ObservableCollection<Test>();
        collection.Add(new Test() { Id = 1 });
        collection.Add(new Test() { Id = 2, Name = "Rohan" });
        collection.Add(new Test() { Id = 3, Name = "Guy" });
        collection.Add(new Test() { Id = 4, Name = "Mike" });

        string s = "Rohan";
        var temp = collection.FirstOrDefault(x =>
        {
            return x.Name.Equals(s);               

        });

我们在基础集合中使用了 null 字段。那么如何使用linq查询

4

6 回答 6

1

返回类型不同。

if (x.Name != null)
{
    return x.Name.ToString().Equals(s); // returns bool
}
else
{
    return x.Name; // returns string (or null)
}

您可能需要的是:

collection.FirstOrDefault(x => x == s);
于 2013-06-20T15:02:16.817 回答
1

它应该像var temp = collection.FirstOrDefault(x => x.Name == s);

于 2013-06-20T14:55:43.963 回答
0

您传入的 lambda 表达式FirstOrDefault需要返回一个布尔值。尝试这个:

string s = "Rohan";
var temp = collection.FirstOrDefault(x => (x.Name != null) &&
                                          (x.Name.Equals(s)));

或者更简单地说:

var temp = collection.FirstOrDefault(x => x.Name == s);

FirstOrDefault如果没有找到符合您的条件的项目,则可以返回 null,因此在使用之前检查 null 值是个好主意temp

if (temp == null)
{
    // not found...
}
于 2013-06-20T14:55:54.960 回答
0

看起来您正在尝试获取名称等于的第一个项目Rohan

// Name is string, you don't need to call ToString() for comparison
var temp = collection.FirstOrDefault(x => x.Name == s);

您当前的查询有什么问题?FirstOrDefault方法需要谓词参数,它返回布尔结果。但目前您正试图x.Name从谓词返回字符串。

var temp = collection.FirstOrDefault(x =>
    {
        if (x.Name != null)
        {
            // this is OK, you are returning boolean                
            return x.Name.ToString().Equals(s);
        }
        else
        {
            // instead of return x.Name which is string
            return false;
        }
    });

您修改后的代码会引发错误,因为集合中的某些对象可以具有Name等于null. 当你试图打电话时null.Equals(s),你会得到一个NullReferenceException. 要解决此问题,只需比较两个字符串:

   var temp = collection.FirstOrDefault(x => 
              {
                  //return x.Name.Equals(s);
                  return x.Name == s; // will not throw if name is null
              });
于 2013-06-20T14:56:14.737 回答
0

我不知道你想达到什么目标,但你完全做错了:)

var temp = collection.FirstOrDefault(x =>
    {
        if (x.Name != null)
        {
            // this part returns bool
            return x.Name.ToString().Equals(s);
        }
        else
        {
            // this one returns string
            return x.Name;
        }
    });

我认为你在这里寻找非常简单FirstOrDefault(x => x == s);

于 2013-06-20T14:56:14.920 回答
0

FirstOrDefault 接受一个为集合中的每个元素返回 TRUE 或 FALSE 的委托。

在您的 ELSE 中,您需要x.Name比较s

return x.Name.Equals(s);

, 不只是

 return x.Name;
于 2013-06-20T14:57:13.107 回答