我们使用以下代码段根据名称object
从collection
中选择特定的property
。
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 \ vadiveln \ documents \ visual studio 2010 \ Projects \ WindowsFormsApplication12 \ WindowsFormsApplication12 \ Program.cs 36 25 WindowsFormsApplication12 错误2无法将类型'string'隐式转换为'bool'C:\ Users \ vadiveln \ 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查询
答案 0 :(得分:1)
它应该像var temp = collection.FirstOrDefault(x => x.Name == s);
答案 1 :(得分: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);
答案 2 :(得分:0)
传递给FirstOrDefault
的lambda表达式需要返回一个布尔值。试试这个:
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,因此在使用temp
之前检查空值是个好主意:
if (temp == null)
{
// not found...
}
答案 3 :(得分: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
});
答案 4 :(得分: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);
。
答案 5 :(得分:0)
FirstOrDefault接受一个委托,该委托对集合中的每个元素都返回TRUE或FALSE。
在您的ELSE中,您需要将x.Name
与s
进行比较:
return x.Name.Equals(s);
,而不仅仅是
return x.Name;