比较2个列表并应用规则

时间:2014-01-25 14:15:24

标签: c# lambda

我有一个可能的字符串列表:

ListOfPossibleStrings

  • 字符串1
  • 字符串2
  • STRING3
  • 串,4
  • STRING5
  • String6
  • String7
  • String8
  • String9
  • String10

ListOfScenario1Strings

  • 字符串2
  • 串,4
  • String7
  • String8

ListOfScenario2Strings

  • STRING3
  • String9
  • String10

我可以选择ListOfPossibleStrings中任何项目的组合来添加到另一个列表..让我们称之为ListOfSelectedStrings。

但是,我需要根据ListOfSelectedStrings中的whats在这些场景中调用不同的函数

情景1

如果ListOfSelectedStrings只包含ListOfScenario1Strings中的任何字符串 - 调用函数HidePage();

场景2

如果ListOfSelectedStrings只包含ListOfScenario2Strings中的任何字符串 - 调用函数ShowPageConditional();

场景3

如果ListOfSelectedStrings包含来自ListOfScenario1Strings和ListOfScenario2Strings的任何字符串的组合)和/或包含String1,String5,String6调用函数ShowPageMandatory();

我想到了一些东西,比如这可能适用于方案1但是它'可以'包含任何其他字符串,因为它不排除其他字符串。

if (ListOfSelectedStrings.Any(x => ListOfScenario1Strings.Any(y => y.StringValue == x)))
{
    HidePage();
}

2 个答案:

答案 0 :(得分:1)

我会制作3个列表

的List1 列表2 项目list3

bool anyList1 = ListOfSelectedStrings.Any(x => List1.Any(y => y.StringValue == x));
bool anyList2 = ListOfSelectedStrings.Any(x => List2.Any(y => y.StringValue == x));
bool anyList3 = ListOfSelectedStrings.Any(x => List3.Any(y => y.StringValue == x));

然后处理逻辑

if(anyList3) ShowPageMandatory(); 
else if (anyList1 && anyList2)  ShowPageMandatory();
else if (anyList1 && !anyList2 && !anyList3) HidePage();
else if (anyList2 && !anyList1 && !anyList3) ShowPageConditional();

考虑HashSet
它有子集,超集和重叠

HashSet Class

答案 1 :(得分:0)

您可以使用LINQ Except方法获取您正在寻找的结果。

  • 当您使用Except时,结果是第一个列表中的所有内容第二个列表中的内容
  • 在结尾处放置Any会告诉您结果中有内容,因此第一个列表中的某些内容不在第二个列表中
  • 然后你可以否定结果,所以你知道第一个列表中的所有内容都在第二个列表中

这些应该可以为您的三种情景提供正确的结果:

if (!ListOfPossibleStrings.Except(ListOfScenario1Strings).Any())
    HidePage();

if (!ListOfPossibleStrings.Except(ListOfScenario2Strings).Any())
    ShowPageConditional();

if (!ListOfSelectedStrings.Except(
         ListOfScenario1Strings.Union(
             ListOfScenario2Strings.Union(
                 new List<string> { "String1", "String5", "String6" }))).Any())
{
    ShowPageMandatory();
}