Kuklinski
Kuklinski

Reputation: 51

LINQ - one bool from multiple conditions of a list with objects

I have a List with four Objects, named Quests. Each Quest Object has properties: Name (string) and State (enum). The State can have five different conditions.

What I need is only one bool, which is true if:

For example, each query separately:

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();

But how to put them in one LINQ query? I tried multiple variations but always got a bool which is false although I know is has to be true. For example:

        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();

Or like this:

             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();

And some other different variations but always without a positive result. Maybe someone with more skills in LINQ can help to find a good solution. Many thanks!

Upvotes: 1

Views: 1268

Answers (2)

Rodrigo Rodrigues
Rodrigo Rodrigues

Reputation: 8556

If you want to make it more generic and don't tie the checks with specific quest names, you can use something like this:

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

Upvotes: 0

Mat J
Mat J

Reputation: 5632

You can create a list of conditions and check if each of condition is satisfied by at least one element in 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));

Upvotes: 1

Related Questions