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中有两个“用户名”,该怎么办?我想向用户发送一次通知。如果有重复的用户名,它将发送两个通知,因为我没有从StreamItemComments的列表中过滤掉重复的Item.Senders。
答案 0 :(得分:3)
考虑编写一个查询来表明你的意图。您需要项目注释的不同发件人,但仅限于发件人不是客户端用户的情况。听起来像一个查询,不是吗?
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()
,但要合并并不困难。
答案 1 :(得分:2)
您可以使用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()
参数。
答案 2 :(得分:1)
使用.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();
答案 3 :(得分:0)
你可以做的是
foreach ( Comment item in StreamItemComments)
将每个通知添加到Dictionary<user,msg>
然后在 Dictionary 中有另一个foreach key
,然后循环将实际消息发送给用户。这将确保每个用户只发送一条消息