在 C# 中添加 class 的删除更新列表

Add Remove Update List of class in C#

我为此工作了一个多星期,目前压力不大, 希望你们能把我从痛苦中解救出来。 如果您也可以建议整体不同的方法,我欢迎。好的,我们开始,

我正在学习并使用 SignalR、MVC、JSON、jquery 创建一个小型聊天应用程序。

我有 Chatter class,其中包含 ChatMsg class(消息)列表。正如下面的 GetData() 方法所示,我正在将我的 classes 从数据库填充到列表中。如您所见,Chatter 列表包含一些变量,包括 ChatMsg 列表。这将对 Table(新的聊天消息)进行任何更改。 到这里为止,一切正常。 [添加部分]

[Serializable]
public class Chatter
{
    public string Name { get; set; }
    public bool Open { get; set; }
    public DateTime LastMsg { get; set; }
    public IEnumerable<ChatMsg> Msgs { get; set; }
}

[Serializable]
public class ChatMsg
{
    public DateTime MsgCreated { get; set; }
    public string MsgType { get; set; }
    public string MsgBody { get; set; }
}

public List<Chatter> GetData()
{

    Dictionary<string, List<ChatMsg>> dcm = new Dictionary<string, List<ChatMsg>>();
    List<Chatter> lcm = new List<Chatter>();

    using (var connection = new SqlConnection(_connString))
    {
        connection.Open();
        using (var command = new SqlCommand(@"SELECT [Sender], [Receiver], [Body], [MessageCreated] FROM [dbo].[Chat] WHERE [Receiver] = @Name AND [Seen] = @Seen", connection))
        {
            command.Parameters.Add(new SqlParameter("@Name", "Fan"));//Test val
            command.Parameters.Add(new SqlParameter("@Seen", "0"));//Test val
            command.Notification = null;

            var dependency = new SqlDependency(command);
            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

            if (connection.State == ConnectionState.Closed)
                connection.Open();

            var reader = command.ExecuteReader();

            while (reader.Read())
            {

                List<ChatMsg> cm = new List<ChatMsg>();
                cm.Add(item: new ChatMsg { MsgCreated = Convert.ToDateTime(reader["MessageCreated"]), MsgType = "from", MsgBody = (string)reader["Body"] });

                if (dcm.ContainsKey((string)reader["Sender"]))
                { dcm[(string)reader["Sender"]].Add(item: new ChatMsg { MsgCreated = Convert.ToDateTime(reader["MessageCreated"]), MsgType = "from", MsgBody = (string)reader["Body"] }); }
                else { dcm.Add((string)reader["Sender"], cm); }
            }
        }
    }

    foreach (KeyValuePair<string, List<ChatMsg>> pair in dcm)
    {
        lcm.Add(item: new Chatter { Name = pair.Key, Open = true, LastMsg = DateTime.UtcNow, Msgs = pair.Value });
    }
    // Updateting [Seen] = 1 here
    return lcm;
}

现在,如果这是一个新实例,我会将此 Chatters 列表放入会话。

每次 getData() 获取新数据时,我想检查我的 Session["ChatHistory"],如果 Parent.Name 存在,我想更新 Parent 和 Addrange 到 Msgs,如果不从 getData() 会话列表中添加新父级。 我正在为以下代码而苦苦挣扎。

public string receiveMessages()
{
    if (Session["ChatHistory"] == null) Session["ChatHistory"] = new List<Chatter>();
    List<Chatter> lc = (List<Chatter>)Session["ChatHistory"];

    ChatRepository chatRepository = new ChatRepository();

    List<Chatter> c = (List<Chatter>)chatRepository.getData();

    //havent tested below
    foreach (Chatter e in c)
    {
        var temp_lc = lc.Find(n => n.Name == e.Name);// Can we avoid linq?
        if (temp_lc == null)
        {
            lc.Add(e);
        }
        else
        {
            // How to Addrange to Msgs?
        }

    }

    var serializer = new JavaScriptSerializer();
    var t = serializer.Serialize(lc);
    return t;
}
  1. 如何更新 class 列表中的 class 列表?
  2. 如何从 class 列表中删除项目?

非常感谢!

考虑使用 chatterschatterHistory 之类的变量名称,而不是 clc。它使它更容易阅读。

尝试像这样在 receiveMessages() 中重写你的 foreach

foreach (Chatter e in c)
{
    var temp_lc = lc.Where(x => x.Name == e.Name).SingleOrDefault();
    if (temp_lc == null)
    {
        lc.Add(e);
    }
    else
    {
        temp_lc.Msgs = temp_lc.Msgs.Concat(e.Msgs).ToList();
    }
}

如果 temp_lc 存在,temp_lc.Msgs.Concat(e.Msgs).ToList() 将连接 Msgs 属性 和 e.MsgsToList() 将其转换为 List<ChatMsg>,然后我们可以将整个东西分配回 temp_lc.Msgs

最后一步很重要,因为 Concat() 不会改变 (更改)调用它的对象 - 相反,它 returns 一个新对象然后我们可以分配回 temp_lc.Msgs.