1

私のlinqに少し問題があるようです。グループ用のデータコントラクトがあり、メッセージ用に別のデータコントラクトがあります。メッセージはグループの一部にすることができます。ただし、メッセージ レコードを更新すると、グループ情報を一覧表示したときに反映されず、メッセージはそのグループに対して同じままです。しかし、メッセージを直接リストすると、更新は反映されますか?

グループにメッセージを追加する方法は次のとおりです。

    //lists for reference:
    List<Group> Groups = new List<Group>();
    List<Message> messages = new List<Message>();

    //not sure the below method is correct for adding a message to a group
    public void AddMessagetoGroup(string group, string messageID, string message)
    {
        var result = Groups.Where(n => String.Equals(n.GroupName, group)).FirstOrDefault();
        var result1 = messages.Where(n => String.Equals(n.MessageID, messageID)).FirstOrDefault();
        if (result != null)
        {
            result.GroupMessages.Add(new Message() { MessageID = messageID, GroupMessage = message });
        }
        if (result1 != null)
        {
            result1.MessageGroup.Add(new Group() { GroupName = group });
        }

    }

メッセージをグループに追加すると、メッセージに加えた変更が反映されるはずです。私が考えることができる唯一のことは、既存のメッセージの新しいインスタンスを追加することです。つまり、私の更新メソッドはメッセージをコピーするだけですが、この新しいコピーされたレコードはどこに保持されていますか? 修正が難しい場合、代わりにグループにコピー/追加されたメッセージを更新するにはどうすればよいですか (安価な回避策)?

4

1 に答える 1

1

グループがメッセージを持つことができ、メッセージがグループを持つことができると仮定すると、次の 5 つのことを維持しようとしています。

  1. すべてのグループのリストList<Group> Groups = ...
  2. すべてのメッセージのリストList<Message> messages = ...
  3. List<Message> GroupMessages...グループ内の各グループのメッセージ
  4. List<Group> MessageGroup...Message 内の各メッセージのグループ
  5. グループに送信する実際のメッセージがいくつかの場所で更新されました

私が見ることができるのは、正しく維持されていない最後のものです:

  • で、AddMessagetoGroup「new」Messageを に関連付けますGroup.GroupMessages。これはクラスの新しいインスタンスであり、他の Message インスタンスを更新しても自動的には更新されません。2 つのメッセージが同じMessageIdだからといって、それらが同じインスタンスであるとは限りません。

  • 特定のメッセージを変更しますが、UpdateMessageメッセージ リストでのみ変更します。これは、グループ リスト内の同じメッセージを指していません。

全体として、コードを本当にやりたいようにするには、リファクタリングが必要です。グループとメッセージを別々に保ち、コピーを作成するのではなく、一度に参照したいというのが私の見方です。

まず、マスター リスト:

List<Group> Groups = new List<Group>();
List<Message> Messages = new List<Message>();

次に、メッセージを作成または更新します (作成部分はまだありません)。

public Message CreateOrUpdateMessage(string messageID, string groupMessage)
{
    var findmessage = Messages.Where(s => s.MessageID == messageID).FirstOrDefault();

    if (findmessage != null)
    {
        findmessage.GroupMessage = groupMessage;
    }
    else
    {
        findmessage = new Message() { MessageID = messageID, GroupMessage = groupMessage};
        Messages.Add(findmessage);
    }

    return findmessage;
}

このメッセージをメッセージ リストに追加する方法に注意してください。これは、メッセージを追加または変更する唯一の関数です。

最後にメッセージをグループに追加します (ここではグループの追加について心配していません):

public void AddMessagetoGroup(string group, string messageID, string message)
{
    var findmessage = CreateOrUpdateMessage(messageID, message); 
    var findgroup = Groups.Where(n => String.Equals(n.GroupName, group)).FirstOrDefault();

    if (findgroup != null)
    {
        if (findgroup.GroupMessages.Where(m => m.MessageID == messageID).Count() == 0)
        {
            findgroup.GroupMessages.Add(findmessage);
            findmessage.MessageGroup.Add(findgroup);
        }
    }
}

この関数はメッセージも作成し、メッセージ全体または特定のグループのメッセージのいずれかに重複がないことを確認することに注意してください。

于 2012-04-27T06:43:19.533 に答える