【问题标题】:Grouping multiple conditions in IF statements C#在 IF 语句中对多个条件进行分组 C#
【发布时间】:2012-04-28 07:07:41
【问题描述】:

我正在编写一个程序,该程序需要执行搜索作为必需功能之一。用户应该能够使用任意数量的字段,范围从没有到全部(总共 7 个)。到目前为止,我已经成功地将每个数据输入案例分组到一个 if 语句中,如下所示:

List<TypeClass> myList = new List<TypeClass>

foreach TypeClass currentItem in myList

{
    if (data1 == currentItem.GetData1() || data1 == "Do Not Search" && (data2 == currentItem.GetData2() || data2 == "Do Not Search") && (data3...)

    {
        //Stuff
    }

}

如果您注意到,我将每个数据字段分组在括号内,因此只有当输入的每个数据都是所需条件或“空字段”时,才能满足该语句。但是,我不能像对其他数据 2、3、4 那样对语句的第一部分进行分组...相反,即使有其他搜索字段不满足该声明。如果我使用额外的括号,程序将完全忽略 if 语句并将其视为根本没有任何情况匹配。

所以如果我这样写:

if ((data1 == currentIten.GetData1 || data1 == "Do Not Search") && (data2...)

没有检查任何内容,并且该语句被忽略。这是正常的吗?有没有更好/更有效的方法来处理可选的搜索字段选择?

编辑:抱歉打错了,每个 GetDataX 都是一个访问器,我忘了写括号 ()

【问题讨论】:

  • 我猜测在您提供给我们的代码之外发生了一些事情。你确定data1 设置正确吗?
  • 是的,所有数据都在那里,实际检查它是我现在的问题。如果我在开头取出双括号并只用一个替换它,一切正常,但它没用,因为如果数据 1 评估为真,但任何其他数据没有,则不管怎样,整个语句都将评估为真。
  • 当然你需要在 data1 条件周围加上括号。仔细检查值。其中一个 dataX 不匹配,将整个表达式评估为假。将 if 重写为一系列嵌套的 if,单步执行并查看不匹配的位置。
  • @ad 我仍然不相信。您的第一个if 不正确,因为&amp;&amp; 的操作顺序高于||,将首先评估。我会三次检查data1 是否设置为您列表中存在的值或确切的"Do Not Search" 字符串。
  • 对不起,我不知道你是否理解我的问题。如果我在 data1 周围加上额外的括号,则不会检查任何内容。至于检查值,我目前正在测试仅对 data1 的搜索,所以我写了一个 'string checkData1 = currentItem.GetData;'就在 If 语句之前,是的,它肯定匹配。因此,data1 是我目前唯一的变量,因为其他所有字段都有“请勿搜索”选项。

标签: c# if-statement conditional-statements


【解决方案1】:

我会将匹配移动到类中,而不是处理 7 个单独的可能值来匹配,而是将它们设为一个名为 criteria 的类实例。请参阅下面的示例代码:

public enum States
{
    None,
    Tenesee,
    Georgia,
    Colorado,
    Florida
}
class Item
{
    public States State { get; set; }
    public string Name { get; set; }
    public int ID { get; set; }

    public bool IsMatch(Item criteria)
    {
        bool match = true;
        if (criteria.State != States.None) match &= criteria.State == State;
        if (!string.IsNullOrEmpty(criteria.Name)) match &= criteria.Name.Equals(Name);
        if (criteria.ID > 0) match &= criteria.ID == ID;
        return match;
    }
    public override string ToString()
    {
        return string.Format("ID={0}, Name={1}, State={2}", ID.ToString(), Name, State.ToString());
    }
}
class Program
{

    static void Main(string[] args)
    {

        List<Item> list = new List<Item>();
        list.Add(new Item() { ID = 10016, Name = "Julia", State = States.Georgia });
        list.Add(new Item() { ID = 10017, Name = "Scott", State = States.Colorado });
        list.Add(new Item() { ID = 10018, Name = "Samantha", State = States.Tenesee });
        list.Add(new Item() { ID = 10019, Name = "Julia", State = States.Florida });


        Item criteria = new Item()
        {
            State = States.Tenesee,
            ID = 10018
        };
        List<Item> selection = list.FindAll((item) => item.IsMatch(criteria));

        foreach (var item in selection)
        {
            Console.WriteLine("{0}", item);
        }

    }
}

有了结果 ID=10018, Name=Samantha, State=Tenesee

因此,您构建了一个条件实例Item 并比较是否有明确定义的属性。循环遍历所有项目并选择符合条件的项目。显然,您必须为所有 7 个属性扩展 .IsMatch()

【讨论】:

    【解决方案2】:

    把所有的可能性都放在 hashset 中。

    Hashset with all possibilities.
    
    foreach(item in selectedItems) //you may not need this if you dont have to perform action forall selected items.
    {
         if (Hashset contains item)
           //do stuff.
    }
    

    【讨论】:

      【解决方案3】:

      你可以对一个或条件这样做

              List<string> mylist = new List<string>();
              string data1 = "test1";
              string data2 = "test2";
              string data3 = "test3";
              string data4 = "test4";
      
      
              foreach (string s in mylist)
              {
                  bool found = false;
      
                  if(data1.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
      
                  if (data2.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
      
                  if (data3.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
      
                  if (data4.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
      
      
              }
      

      或者像这样的and条件

              List<string> mylist = new List<string>();
              string data1 = "test1";
              string data2 = "test2";
              string data3 = "test3";
              string data4 = "test4";
      
      
              foreach (string s in mylist)
              {
                  bool found = false;
                  bool notfound = false;
      
                  if(data1.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
                  else
                  {
                      notfound = true;
                  }
      
                  if (data2.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
                  else
                  {
                      notfound = true;
                  }
                  if (data3.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
                  else
                  {
                      notfound = true;
                  }
                  if (data4.Equals(s) || data1.Equals("Do not Search"))
                  {
                      found = true;
                  }
                  else
                  {
                      notfound = true;
                  }
      
                  // Force all to match
                  if (notfound)
                      return null;
              }
      

      我的偏好是这样的,但您可以利用搜索功能来做您需要的事情.....

      List<string> mylist = new List<string>();
      
              List<string> mysearches = new List<string>();
      
              string data1 = "test1";
              string data2 = "test2";
              string data3 = "test3";
              string data4 = "test4";
      
              if(data1 != "Do not Search")
                  mysearches.Add(data1);
              if (data2 != "Do not Search")
                  mysearches.Add(data2);
              if (data3 != "Do not Search")
                  mysearches.Add(data3);
              if (data4 != "Do not Search")
                  mysearches.Add(data4);
              bool found = false;
              bool andconditionmatch = true;
      
              foreach (string s in mylist)
              {
                  if (mysearches.Contains(s))
                  {
                      found = true;
                  }
                  else
                  {
                      andconditionmatch = false;
                  }
              }
      

      【讨论】:

      • 请注意,如果您要求所有 (and) 匹配或只匹配一个 (or),则需要调整最后一个选项。 - 修改答案以显示
      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2015-03-24
      • 2013-04-23
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多