【问题标题】:LINQ - one bool from multiple conditions of a list with objectsLINQ - 来自具有对象的列表的多个条件的一个布尔值
【发布时间】:2021-05-31 18:08:11
【问题描述】:

我有一个包含四个对象的列表,名为任务。每个任务对象都有属性: 名称(字符串)和状态(枚举)。状态可以有五种不同的条件。

我只需要一个布尔值,如果:

  • 三个特定任务的状态为完成
  • 某个特定任务处于非活动状态

例如,每个单独的查询:

bool isDone1 = Quests.Where(q => q.Name is "Quest1" && q.State is QuestState.Done).Any();
bool isDone2 = Quests.Where(q => q.Name is "Quest2" && q.State is QuestState.Done).Any();
bool isDone3 = Quests.Where(q => q.Name is "Quest3" && q.State is QuestState.Done).Any();
bool isInactive = Quests.Where(q => q.Name is "Quest4" && q.State is QuestState.Inactive).Any();

但是如何将它们放在一个 LINQ 查询中呢? 我尝试了多种变体,但总是得到一个错误的布尔值,尽管我知道它必须是真的。例如:

        bool test= (from quest in Quests
                                   where quest.Name is "Quest1" && quest.State is QuestState.Done
                                   where quest.Name is "Quest2" && quest.State is QuestState.Done
                                   where quest.Name is "Quest3" && quest.State is QuestState.Done
                                   where quest.Name is "Quest4" && quest.State is QuestState.Inactive
                                   select quest).Any();

或者像这样:

             bool test= (from quest in Quests
                                       where quest.Name is "Quest1" && quest.State is QuestState.Done &&
                                       quest.Name is "Quest2" && quest.State is QuestState.Done &&
                                       quest.Name is "Quest3" && quest.State is QuestState.Done &&
                                       quest.Name is "Quest4" && quest.State is QuestState.Inactive
                                       select quest).Any();

还有其他一些不同的变化,但总是没有积极的结果。 也许有更多 LINQ 技能的人可以帮助找到一个好的解决方案。 非常感谢!

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    您可以创建一个list of conditions 并检查每个condition 是否满足quests 中的至少一个元素。

    var conditions = new[]
    {
        new {Name = "Quest 1", State = QuestState.Done},
        new {Name = "Quest 2", State = QuestState.Done},
        new {Name = "Quest 3", State = QuestState.Done},
        new {Name = "Quest 4", State = QuestState.Inactive},
    };
    
    
    var success= conditions.All(condition => quests.Any(quest => quest.Name == condition.Name && 
                                                        quest.State == condition.State));
    

    【讨论】:

      【解决方案2】:

      如果您想让它更通用并且不将检查与特定任务名称联系起来, 你可以使用这样的东西:

      bool test = Quests.Count(q => q.State = QuestState.Done) == 3
               && Quests.Count(q => q.State = QuestState.Inactive) == 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-21
        • 1970-01-01
        • 1970-01-01
        • 2015-08-26
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多