使用linq组合对象

时间:2010-04-08 15:00:38

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

我有一个实现IEnumerable接口的类的2个实例。我想创建一个新对象并将它们合二为一。我知道我可以使用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'.

4 个答案:

答案 0 :(得分:3)

我遇到了一个字节数组的问题。我做了什么来解决我的问题:

col1.Concat(col2).ToArray();

如果你有一个清单:

col1.Concat(col2).ToList();

答案 1 :(得分:2)

尝试这样的事情:

var combined = firstSequence.Concat(secondSequence);

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

答案 2 :(得分:1)

您需要使用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);

答案 3 :(得分:1)

Enumarable.Concat方法返回IEnumerable<Message>(或实际上是<ConcatIterator>d__71<Message>,如异常消息所示)。您无法将其转换为Messages类型。您可以执行以下操作:

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

并确保您的Messages类型的构造函数采用IEnumerable<Message>

public class Messages : IEnumerable, IEnumerable<Message>
{
    private List<Message> message;

    public Message(IEnumerable<Message> messages)
    {
        this.message = new List<Message>(messages);
    }

    //Other methods
}