LINQ查询语法中是否提供了union?

时间:2018-06-15 00:23:50

标签: c# linq

我注意到我无法使用ANSI syntax使用union两个选项构建linq查询。

.net文档中有一篇关于query syntax examples的文章,其中未显示union。但是,在.net examples for method syntax下,会给出一个联合示例。

我知道我可以将查询语法选择和基于方法的选择结合起来绕过这个问题,但我很好奇我是否可以完全没有基于方法的语法。

var strings =
          from MemberInfo member in Whitelist.Members
          select member.ToString()
          union
          from Type type in Whitelist.Types
          select type.ToString();

3 个答案:

答案 0 :(得分:2)

答案是否定的。尽管你可以在查询语法中做到这一点,但它缺少一些基本的操作(如你所见)。您必须使用扩展方法。

鉴于

Query Keywords (C# Reference)

Enumerable.Union Method (IEnumerable, IEnumerable)

  

使用默认相等性生成两个序列的集合并   比较器。

示例

ProductA[] store1 = { new ProductA { Name = "apple", Code = 9 }, 
                       new ProductA { Name = "orange", Code = 4 } };

ProductA[] store2 = { new ProductA { Name = "apple", Code = 9 }, 
                       new ProductA { Name = "lemon", Code = 12 } };

var union = store1.Union(store2);

var union =
     (from MemberInfo member in Whitelist.Members select member.ToString()).Union
     (from Type type in Whitelist.Types select type.ToString());

或同等的

var union =
    (from MemberInfo member in Whitelist.Members select member.ToString()).Concat
    (from Type type in Whitelist.Types select type.ToString()).Distinct();

答案 1 :(得分:1)

您需要使用Union方法。就像那样。

var strings = (from MemberInfo member in Whitelist.Members
          select member.ToString())
          .Union(
          from Type type in Whitelist.Types
          select type.ToString());

答案 2 :(得分:1)

LINQ和ANSI查询只有相似之处。应该很少期望任何ANSI语法都跨越到LINQ。

UNION也不例外。

以下是我的三个首选选项:

(1)

var strings =
    Enumerable
        .Union(
            from MemberInfo member in Whitelist.Members
            select member.ToString(),
            from Type type in Whitelist.Types
            select type.ToString());

(2)

var members =
    from MemberInfo member in Whitelist.Members
    select member.ToString();

var types =
    from Type type in Whitelist.Types
    select type.ToString()

var strings = Enumerable.Union(members, types);

(3)

var strings =
    (
            from MemberInfo member in Whitelist.Members
            select member.ToString()
    ).Union(
            from Type type in Whitelist.Types
            select type.ToString()
    );

我喜欢这些选项,因为它们有助于清楚地显示正在执行Union