我有两个列表,其中一个列表InboxTemp
会自动填充所有存在的对象。另一个列表NewMessages
随机(10-60秒)收到新对象。我遇到的问题是,我希望allList
在newList
中添加对象而不重复。
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
- 列表。
答案 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;
}