代码之家  ›  专栏  ›  技术社区  ›  Aleksey Pavlov

如何使用一个WHERE语句返回两个数组

  •  4
  • Aleksey Pavlov  · 技术社区  · 7 年前

    是否可以将这两个语句合并为一个返回“contains”和“not contains”结果的语句?

    string[] words = { "one", "two", "three", "four" };
    int[] numbers = { 4, 5, 6 };
    
    string[] contains =
        (from w in words
         where numbers.Contains(w.Length)
         select w).ToArray();
    
    string[] notContains =
        (from w in words
         where !numbers.Contains(w.Length)
         select w).ToArray();
    
    2 回复  |  直到 7 年前
        1
  •  8
  •   Cristian Lupascu    7 年前

    您可以执行以下操作:

    var groups = words.GroupBy(w => numbers.Contains(w.Length));
    

    这将返回最多两个组:一个带键 false 还有一把钥匙 true .

    编辑

    vc 74 在评论中指出, numbers.Contains 是O(n)操作,当 numbers 是一个数组。相反,将其转换为哈希集将使其成为一个常数时间操作,其渐进速度要快得多。

    下面是更新后的代码:

    var numberHS = new HashSet<int>(numbers);
    var groups = words.GroupBy(w => numberHS.Contains(w.Length));
    
        2
  •  6
  •   Tim Schmelter    7 年前

    您还可以使用 ToLookup :

    var containsLengthLookup = words.ToLookup(w => numbers.Contains(w.Length));
    string[] contains = containsLengthLookup[true].ToArray();
    string[] notContains = containsLengthLookup[false].ToArray();
    

    如果两者之一为空(或源数组为空),则会得到一个空 string[] .

    有一点不同 GroupBy ,将缓存查找。因此,如果您多次使用它,效率会更高,但信息只是一个快照。如果您修改 words numbers 这不会反映在查找中。