在 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;
}
- 如何更新 class 列表中的 class 列表?
- 如何从 class 列表中删除项目?
非常感谢!
考虑使用 chatters
和 chatterHistory
之类的变量名称,而不是 c
和 lc
。它使它更容易阅读。
尝试像这样在 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.Msgs
。 ToList()
将其转换为 List<ChatMsg>
,然后我们可以将整个东西分配回 temp_lc.Msgs
。
最后一步很重要,因为 Concat()
不会改变 (更改)调用它的对象 - 相反,它 returns 一个新对象然后我们可以分配回 temp_lc.Msgs
.
我为此工作了一个多星期,目前压力不大, 希望你们能把我从痛苦中解救出来。 如果您也可以建议整体不同的方法,我欢迎。好的,我们开始,
我正在学习并使用 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;
}
- 如何更新 class 列表中的 class 列表?
- 如何从 class 列表中删除项目?
非常感谢!
考虑使用 chatters
和 chatterHistory
之类的变量名称,而不是 c
和 lc
。它使它更容易阅读。
尝试像这样在 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.Msgs
。 ToList()
将其转换为 List<ChatMsg>
,然后我们可以将整个东西分配回 temp_lc.Msgs
。
最后一步很重要,因为 Concat()
不会改变 (更改)调用它的对象 - 相反,它 returns 一个新对象然后我们可以分配回 temp_lc.Msgs
.