从注释类型的列表中获取不同的值
本文关键字:获取 列表 注释 类型 | 更新日期: 2023-09-27 18:18:59
List<Comment> StreamItemComments = objStreamItem.GetComments();
…
foreach (Comment Item in StreamItemComments)
{
if (ClientUser.UserName != Item.Sender)
{
Notification notificationObj = new Notification
{
Sender = ClientUser.UserName,
Recipient = Item.Sender,
Value = "whatever value here",
TrackBack = "",
IsRead = false
};
notificationObj.Add();
}
}
如果Item.Sender的List中有两个'username'怎么办?我想向用户发送一次通知。在这里,如果有重复的用户名,它会发送两个通知,因为我没有过滤掉重复的项目。来自StreamItemComments.
考虑编写一个查询来说明您的意图。您需要条目注释的不同发送者,但仅当发送者不是客户端用户时才需要。听起来像个问题,不是吗?
var recipients = StreamItemComments
.Where(item => item.Sender != ClientUser.UserName)
.Select(item => item.Sender)
.Distinct();
然后可以使用此查询来构建通知
foreach (var item in recipients)
{
var notificationObj = new Notification
{
Sender = ClientUser.UserName,
Recipient = item,
...
}
notificationObj.Add();
}
您也可以将此对象构造放入查询中,但是对于每个对象的.Add()
调用,我将其排除在查询之外。合并起来并不困难,尽管您仍然需要遍历输出并为每个结果调用.Add()
。
您可以使用HashSet
来确定您是否已经处理了用户名。
var set = new HashSet<string>();
foreach (var item in collection)
{
if (set.Contains(item))
continue;
set.Add(item);
// your notification code
}
对于您的具体问题,set
将包含用户名(Item.Sender
)。因此,您可能需要更改Add()
参数。
使用.Distinct()
。因为你不能使用默认的比较器,你可以实现一个像这样的
class MyEqualityComparer : IEqualityComparer<Comment>
{
public bool Equals(Comment x, Comment y)
{
return x.Sender.Equals(y.Sender);
}
public int GetHashCode(Comment obj)
{
return obj.Sender.GetHashCode();
}
}
然后像这样过滤它们。您不需要if
语句。
List<Comment> StreamItemComments = objStreamItem.GetComments()
.Distinct(new MyEqualityComparer())
.Where(x => x.Sender != ClientUser.UserName)
.ToList();
你可以在
foreach ( Comment item in StreamItemComments)
将每个通知添加到Dictionary<user,msg>
key
发送实际消息给用户。这将确保每个用户只发送一条消息