0

所以我试图使用 FindAll 返回匹配的对象列表。例如,当我只使用一种条件时,它的效果很好

patientstatus = statuslist.FindAll(delegate(StatusReader.onestatus p1)
{
   return p1.WL_ID == patlist[i].wl_id;
});

但我想使用多个条件,其中一些包含 if 语句,我不知道如何。似乎格式需要有一个返回语句,微软的示例(http://msdn.microsoft.com/en-us/library/fh1w7y8z.aspx)只使用了一个条件。

我可以为每个条件设置多个 FindAll 方法,或者只创建一个循环来自己扫描所有值,但是我肯定缺少一个明显的东西,对吗?

4

4 回答 4

2

我不太确定“if 循环”是什么,但你总是可以将它们拼接在一起:

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;
});
于 2012-09-11T13:39:09.433 回答
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;
}
于 2012-09-11T13:39:51.593 回答
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));
});
于 2012-09-11T13:42:02.607 回答
1

您的委托只需要返回 true 以匹配您的条件,返回 false 以不匹配您的条件。它不必是单行返回语句。您可以在委托中创建布尔值、if 语句、for 循环以及您想要的任何其他内容 - 只要它在所有代码路径中返回 true 或 false。

因此,您可以根据需要执行任意数量的 if 语句或循环。

如果您真的想将其保持为一条线,则可以执行以下操作...

return (condition1 == condition1) || (condition2 == condition2) || (condition3 == condition3);
于 2012-09-11T13:42:49.510 回答