【问题标题】:If condition to check if all values of one list is present in another list如果条件检查一个列表的所有值是否存在于另一个列表中
【发布时间】:2021-09-19 21:04:49
【问题描述】:

我需要写一个 if 条件。只有当国家列表 [A,B,C] 中的所有国家都在单独的列表中可用时,才应输入 if 条件。

CASE 1:如果SeparateList 包含[A,B,C,D,E] 并且如果nationalities List 包含[A,B,C],则nationalities List 中的所有值都可以在SeparateList 中使用。因此它应该满足'if'条件。

CASE 2 :如果SeparateList 包含[A,C,D,E] 并且如果nationalities List 包含[A,B,C],则nationalList 中的B 值在SeparateList 中不可用。因此它不应该满足'if'条件。

但目前我的 if 条件满足案例 2。我认为这是因为 Intersect。 所以请提出任何想法。

 nationalities.Add(nation.ToUpper().Trim()); //contains list of nationalities [A,B,C]
    
 if(nationalities.Intersect(separateList(bg.Nationality)).Any()) 
{
// code 
}

private List<string> separateList(string input)
        {
            return input.ToUpper().Trim().Split(',').ToList();
        }

【问题讨论】:

  • 我不明白你的情况 2,“国籍列表中的 B 值”也不是(不是),“B 值 [...] 在单独列表中不可用”(它是)
  • 是的,在情况 2 条件下出错。现在更正了。
  • 好的。使用 Except 而不是 Intersect 应该可以解决问题
  • 同意Except 将证明它像:containsAll = !nationalities.Except(separateList).Any();containsAll = separateList.Union(nationalities).Count() == separateList.Count
  • 要获得奖励积分,请使用.Except(separateList, StringComparer.CurrentCultureIgnoreCase).Any() 并将这些电话转至ToUpper()

标签: c# list if-statement conditional-statements


【解决方案1】:

注意:看下面的两个解决方案,要么会比原来的答案更好


要么Intersect这2个列表,并且保证交集的长度和nationalities的长度相匹配,要么使用Linq的All方法做类似的事情。

其中之一:

private static bool Test1(IEnumerable<string> separateList, IEnumerable<string> nationalities)
{
    return separateList.Intersect(nationalities).Count() == nationalities.Count();
}

private static bool Test2(IEnumerable<string> separateList, IEnumerable<string> nationalities)
{
    return nationalities.All(n => separateList.Contains(n));
}

现场示例:https://dotnetfiddle.net/Jt5mpX

另一种方式,使用Except

private static bool Test3(IEnumerable<string> separateList, IEnumerable<string> nationalities)
{
    return !nationalities.Except(separateList).Any();
}

还有一个运气好(这是大型数据集的选择)!

private static bool Test4(IEnumerable<string> separateList, IEnumerable<string> nationalities)
{
    return new HashSet<string>(nationalities).IsSubsetOf(separateList);
}

【讨论】:

  • 我已经给出了这样的if(nationalities.All(n =&gt; separateList(bg.Nationality).Contains(n))),但它本身并不令人满意。
  • @ClarkeGriffin 在您的代码中不是 bg.Nationality 逗号分隔的字符串吗?在这种情况下,您需要根据您的原始问题Split(",")
  • nationalities.Add(nation.ToUpper().Trim()); //包含国籍列表 [A,B,C] if(nationalities.All(n =&gt; separateList(bg.Nationality).Contains(n))) { // code } private List&lt;string&gt; separateList(string input) { return input.ToUpper().Trim().Split(',').ToList(); } bg.Nationality 存在一些问题。我没有得到 bg.Nationality 值。请提出建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2022-01-06
  • 2022-01-08
  • 1970-01-01
  • 2020-06-12
相关资源
最近更新 更多