将对象从一个列表添加到另一个列表

时间:2012-12-03 11:27:54

标签: c# list

我有两个列表,其中一个列表InboxTemp会自动填充所有存在的对象。另一个列表NewMessages随机(10-60秒)收到新对象。我遇到的问题是,我希望allListnewList中添加对象而不重复。

public List<object> GetNewMessages()
{
    if (NewMessages.Count > 0 && InboxTemp.Count > 0)
    {
        for (int j = 0; j < NewMessages.Count; j++)
        {
            for (int i = 0; i < InboxTemp.Count; i++)
            {
                if (InboxTemp[i].ID != NewMessages[j].ID)
                {
                    InboxTemp.Add(NewMessages[j]);
                }
            }
        }
    }
    NewMessages.Clear();
    return InboxTemp;
}

这里的问题是我们得到了重复项,我只想让新对象加入InboxTemp - 列表。

5 个答案:

答案 0 :(得分:0)

var newItems = NewMessages.Where(x => !InboxTemp.Any(z => z.ID == x.ID));
InboxTemp.AddRange(newItems);

答案 1 :(得分:0)

如果可能,请创建实现IEqualityComparer的类来比较对象id。

class MyEqualityComparerer : IEqualityComparer<MyMessage>
    {
        public bool Equals(MyMessage x, MyMessage y)
        {
            if (x == null && y == null)
            {
                return true;
            }

            if (x == null)
            {
                return false;
            }

            if (y == null)
            {
                return false;
            }

            return x.Id == y.Id;
        }

        public int GetHashCode(MyMessage obj)
        {
            if(obj == null)
            {
                return 0;
            }

            return obj.Id.GetHashCode();
        }
    }

然后从消息中写入获取不同的值,并将旧列表中不存在的所有值添加到其中

var newItems = newList.Distinct(new MyEqualityComparerer()).Except(oldList, new MyEqualityComparerer()).ToList();
        oldList.AddRange(newItems);

答案 2 :(得分:0)

使用除外:

InboxTemp = InboxTemp.Except(NewMessages);

来自MSDN:

  

使用默认的相等比较器来比较值....来生成两个序列的集合差异。

     

...默认的相等比较器Default用于比较的值   实现IEqualityComparer(Of T)泛型的类型   接口。要比较自定义数据类型,您需要实现此功能   接口并提供自己的GetHashCode和Equals方法   类型。

来源:MSDN Except

答案 3 :(得分:0)

您可以使用Enumerable.Except查找所有新邮件。

public List<Msg> GetNewMessages()
{
    var newMsg = NewMessages.Except(InboxTemp, new MsgComparer()).ToList();
    foreach(var msg in newMsg)
        InboxTemp.Add(msg);
    return newMsg;
}

但您需要为对象创建自定义IEqualityComparer<T>(我将其称为Msg):

public class MsgComparer: IEqualityComparer<Msg>
{
    public bool Equals(Msg x1, Msg x2)
    {
        if (object.ReferenceEquals(x1, x2))
            return true;
        if (x1 == null || x2 == null)
            return false;
        return x1.ID.Equals(x2.ID);
    }

    public int GetHashCode(Msg obj)
    {
        return obj.ID.GetHashCode();
    }
}

答案 4 :(得分:0)

您可以根据发布的内容使用修改后的代码:

public List<object> GetNewMessages()
        {
            if (NewMessages.Count > 0 && InboxTemp.Count > 0)
            {
                for (int j = 0; j < NewMessages.Count; j++)
                {
                    bool found = false;
                    int i = 0;
                    while(!found && i<InboxTemp.Count)
                    {
                        if (InboxTemp[i].ID == NewMessages[j].ID)
                        {
                            found = true;
                        }
                        j++;
                    }
                    if(!found)
                        InboxTemp.Add(NewMessages[j]);
                }
            }
            NewMessages.Clear();
            return InboxTemp;
        }