C# FirstOrDefault似乎无法评估或设置条件
我实际上面临着一个我真的不明白的问题。 情况非常简单: 我正在用C# FirstOrDefault似乎无法评估或设置条件,c#,linq,xamarin.forms,C#,Linq,Xamarin.forms,我实际上面临着一个我真的不明白的问题。 情况非常简单: 我正在用Xamarin.Forms 4.1.0开发一个跨平台应用程序,我需要用Linq过滤observateCollection中的元素。 集合由具有相同类型的两个子元素(左和右)的元素组成。 下面是给我带来问题的代码部分: var element = MyCollection.FirstOrDefault(e => e.Left.Item.Id == searchId || e.Right.Item.Id == searchId);
Xamarin.Forms 4.1.0
开发一个跨平台应用程序,我需要用Linq
过滤observateCollection
中的元素。
集合由具有相同类型的两个子元素(左和右)的元素组成。
下面是给我带来问题的代码部分:
var element = MyCollection.FirstOrDefault(e => e.Left.Item.Id == searchId || e.Right.Item.Id == searchId);
如果请求的id与左侧元素相同(因此在or条件中要计算的第一个id),则一切正常,但如果请求的id等于右侧元素的id,FirstOrDefault
返回null,就像条件被第一条语句短路一样。我还尝试将操作分开,将条件放在Where函数中,放在FirstOrDefault
之前,但没有任何变化
有什么建议吗?谢谢
编辑
对不起,这是更多的代码
class MyClass{
ObservableCollection<MyItem> MyCollection {get; set;}
public MyClass(List<MyItem> list){
MyCollection = new ObservableCollection<MyItem>();
MyCollection.ItemSource = list;
}
public void MyMethod(Guid searchId, string newName){
var element = MyCollection.FirstOrDefault(e => e.Left.Item.Id == searchId || e.Right.Item.Id == searchId);
//more code which is not relevant
}
}
class MyItem{
public Item Left {get; set;}
public Item Right {get; set;}
}
class Item{
public Guid Id {get; set;}
public string Name {get; set;}
}
class-MyClass{
ObservableCollection MyCollection{get;set;}
公共MyClass(列表){
MyCollection=新的ObservableCollection();
MyCollection.ItemSource=列表;
}
public void MyMethod(Guid searchId,字符串newName){
var元素=MyCollection.FirstOrDefault(e=>e.Left.Item.Id==searchId | | e.Right.Item.Id==searchId);
//更多不相关的代码
}
}
类MyItem{
公共项左{get;set;}
公共项权限{get;set;}
}
类项目{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
}
我想我已经找到了这个问题的原因
问题在于,xamarin.forms不能通过重建解决方案来正确地重新加载已部署的应用程序
FirstOrDefault中的lambda表达式最初仅为
e => e.Left.Item.Id == searchId
而不是
e => e.Left.Item.Id == searchId || e.Right.Item.Id == searchId
要解决此类问题,每次修改xaml或cs时,都必须重新生成整个解决方案(或仅重建涉及的项目),并从设备/仿真器中手动删除应用程序
这并不是每次都会发生,但我认为这是避免这些问题的必要实践
我希望这将帮助其他人您需要添加更多代码。什么类型是
Id
?它与searchId
的类型相同吗?短路不适用于OR语句,除非第一个表达式的计算结果为true-因此,如果第一个表达式为false,则将计算第二个表达式。您能否提供一个示例,因为您的解释没有意义。我添加了更多示例code@AnuViswan示例代码,刚刚以正确的可见性编辑,对不起,我们需要一个独立编译的系统,我们可以在我们的终端运行来重现这个问题。