Reputation: 51
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
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
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