所以我试图使用FindAll返回匹配的对象列表。当我只使用一个条件时它很有效,例如
patientstatus = statuslist.FindAll(delegate(StatusReader.onestatus p1)
{
return p1.WL_ID == patlist[i].wl_id;
});
但我想使用多个条件,其中一些包含if语句,我无法弄清楚如何。看起来格式需要有一个return语句,而微软的例子(http://msdn.microsoft.com/en-us/library/fh1w7y8z.aspx)只使用一个条件。
我可以为每个条件设置多个FindAll方法,或者只是创建一个自己扫描所有值的循环,但是必须有一个我不知道的显而易见的事情,对吧?
答案 0 :(得分:2)
我不太确定" if loop"是的,但你总是可以将它们拼接在一起:
patientstatus = statuslist.FindAll(delegate(StatusReader.onestatus p1)
{
if(p1.WL_ID != patlist[i].wl_id)
return false;
if(otherStuff != 5)
return false;
for(var x in p1.stuff)
if(x == 7)
return false;
return true;
});
答案 1 :(得分:2)
尝试以下方法:
var patientStatus = statusList.Where(p => p
{
// Put in logic here as you need
return p.WL_ID == patlist[i].wl_id || p.YourSecondProperty == WhateverYouWantToCheck;
}
答案 2 :(得分:1)
你可以考虑像
这样的东西public abstract class Condition
{
public abstract bool Sutisfied(StatusReader.onestatus status);
}
public class Condition1 : Condition
{
public override bool Sutisfied(StatusReader.onestatus status) {
//check for something and return
}
}
public class Condition2 : Condition
{
public override bool Sutisfied(StatusReader.onestatus status) {
//check for something and return
}
}
之后可以有一个条件列表,比如
List<Condition> conditions =
new List<Condition>{new Conditon1(), new Condition2()}
并在此列表之后使用
patientstatus = statuslist.FindAll(delegate(StatusReader.onestatus status)
{
return conditions.TrueForAll(c=>c.Sutisfied(status));
});
答案 3 :(得分:1)
您的委托只需要为您的条件匹配返回true,而对于您的条件不匹配则返回false。它不必是单行返回语句。您可以创建布尔值,if语句,for循环以及委托中您想要的任何其他内容 - 只要它在所有代码路径中返回true或false。
因此,您可以根据需要执行尽可能多的if语句或循环。
如果您真的希望将其维持为一行,您可以执行以下操作...
return (condition1 == condition1) || (condition2 == condition2) || (condition3 == condition3);