FindAll多个条件

时间:2012-09-11 13:35:02

标签: c#

所以我试图使用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方法,或者只是创建一个自己扫描所有值的循环,但是必须有一个我不知道的显而易见的事情,对吧?

4 个答案:

答案 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);