1

InboxTempリストの 1 つは、存在するすべてのオブジェクトで自動的に満たされる2 つのリストがあります。もう 1 つのリスト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;
}

ここでの問題は、重複が発生することです。新しいオブジェクトを -list で追加したいだけですInboxTemp

4

5 に答える 5

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();
    }
}
于 2012-12-03T11:51:05.893 に答える
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;
        }
于 2012-12-03T11:53:24.937 に答える
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();
        }
    }

次に、メッセージからget Distinct値を記述し、古いリストに存在しないものをすべて追加します。

var newItems = newList.Distinct(new MyEqualityComparerer()).Except(oldList, new MyEqualityComparerer()).ToList();
        oldList.AddRange(newItems);
于 2012-12-03T11:43:45.457 に答える
0

以下を除いて使用:

InboxTemp = InboxTemp.Except(NewMessages);

MSDN から:

デフォルトの等値比較子を使用して値を比較することにより、2 つのシーケンスの差集合を生成します。

...既定の等値比較子である Default は、IEqualityComparer(Of T) ジェネリック インターフェイスを実装する型の値を比較するために使用されます。カスタム データ型を比較す​​るには、このインターフェイスを実装し、その型に対して独自の GetHashCode および Equals メソッドを提供する必要があります。

出典: MSDN を除く

于 2012-12-03T11:47:06.707 に答える
0
var newItems = NewMessages.Where(x => !InboxTemp.Any(z => z.ID == x.ID));
InboxTemp.AddRange(newItems);
于 2012-12-03T11:41:59.570 に答える