从注释类型的列表中获取不同的值

本文关键字:获取 列表 注释 类型 | 更新日期: 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>

并在Dictionary事后循环中另一个foreach key发送实际消息给用户。这将确保每个用户只发送一条消息