【问题标题】:Using linq to combine objects使用 linq 组合对象
【发布时间】:2010-04-08 15:00:38
【问题描述】:

我有 2 个实现 IEnumerable 接口的类实例。我想创建一个新对象并将它们合并为一个。我知道我可以使用for..each 来执行此操作。

有没有 linq/lambda 表达式可以做到这一点?

编辑

public class Messages : IEnumerable, IEnumerable<Message>
{
  private List<Message> message = new List<Message>();

  //Other methods
}

要组合的代码

MessagesCombined messagesCombined = new MessagesCombined();

MessagesFirst messagesFirst = GetMessageFirst();
MessagesSecond messagesSecond = GetMessageSecond();

messagesCombined = (Messages)messagesFirst.Concat(messagesSecond); //Throws runtime exception

//异常是

Unable to cast object of type '<ConcatIterator>d__71`1[Blah.Message]' to type 'Blah.Messages'.

【问题讨论】:

  • IEnumerable 还是 IEnumerable?你的意思是集合连接、联合还是相交?
  • 我又看了一遍,令人惊讶的是,它同时实现了 IEnumerable 和 IEnumerable。不知道我们能做到这一点。我的意思是设置联合。

标签: .net linq lambda linq-to-objects


【解决方案1】:

我对字节数组也有同样的问题。我做了什么来解决我的问题:

col1.Concat(col2).ToArray();

如果你有一个列表:

col1.Concat(col2).ToList();

【讨论】:

    【解决方案2】:

    试试这样的:

    var combined = firstSequence.Concat(secondSequence);
    

    这是使用Enumerable.Concat扩展方法。

    【讨论】:

    • 为什么要为一组消息创建自定义类?只需对所有 3 个使用 IEnumerable&lt;Message&gt;。您遇到的问题是您试图将 Messages 分配给更派生的实例,这是不允许的。
    • >> 为什么要为一组消息创建自定义类?我正在使用现有类型。我不是 Messages 和 Message 类的作者。
    • @DotnetDude,那么你是如何解决这个问题的?你为什么选择这个答案——那不是没有用吗?
    【解决方案3】:

    Enumarable.Concat 方法返回一个IEnumerable&lt;Message&gt;(或者实际上是一个&lt;ConcatIterator&gt;d__71&lt;Message&gt;,如异常消息所示)。您不能将其转换为您的 Messages 类型。您可以执行以下操作:

    var m = new Messages(messagesFirst.Concat(messagesSecond));
    

    并确保您的 Messages 类型有一个采用 IEnumerable&lt;Message&gt; 的构造函数:

    public class Messages : IEnumerable, IEnumerable<Message>
    {
        private List<Message> message;
    
        public Message(IEnumerable<Message> messages)
        {
            this.message = new List<Message>(messages);
        }
    
        //Other methods
    }
    

    【讨论】:

    • @Steven - 我需要结果是消息类型。 var 对我不起作用。
    • 嗯,它是消息类型。 “var” 只是指示编译器根据语句右侧的内容“猜测”最正确的类型;在这种情况下,创建一个 Messages 对象。这叫“类型推断”,真的很有用。
    • @Smith - 那么,如果组合逻辑在返回参数为 Messages 的方法中,我可以返回类型为“var”的对象而编译器不会在运行时抱怨或出现任何异常吗?此外,我对组合列表进行了进一步处理,因此有时我必须将其转换为 Messages。
    • 来自 MSDN:“从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式类型 var。隐式类型的局部变量是强类型的,就像您自己声明类型一样,但编译器确定类型。”如果我写“var i = 2;”,那么 i 将是 int 类型,因为 2 是 int 类型。见这里:msdn.microsoft.com/en-us/library/bb383973.aspx
    • @Smith - 感谢您的解释。我确实明白 var 的类型是从等式右侧推断出的类型。但是,我遇到的问题是我无法从返回类型为 Member 的方法中返回类型为 var 的对象。
    【解决方案4】:

    你会想要使用Concat

    Pet[] cats = GetCats();
    Pet[] dogs = GetDogs();
    
    IEnumerable<Pet> query = cats.Concat(dogs);
    

    根据您的编辑:

    IEnumerable<Message> messagesCombined;
    
    MessagesFirst messagesFirst = GetMessageFirst();
    MessagesSecond messagesSecond = GetMessageSecond();
    
    // if this doesn't work, you can cast both MessagesFirst and MessagesSecond to IEnumerable<Message>
    messagesCombined = messagesFirst.Concat(messagesSecond);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多