получение отличного значения из списка комментариев типа - PullRequest
2 голосов
/ 28 декабря 2011
    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();
            }
        }

Что делать, если в List.Sender есть два «имени пользователя». Я хотел бы отправить уведомление один раз пользователю. Здесь, если есть дубликаты имен пользователей, он отправит два уведомления, потому что я не отфильтровываю дубликаты Item.Senders из списка в StreamItemComments.

Ответы [ 4 ]

3 голосов
/ 28 декабря 2011

Подумайте над тем, чтобы написать запрос с указанием своих намерений. Вы хотите, чтобы отдельные отправители комментариев элемента, но только в том случае, если отправитель не является пользователем клиента. Похоже на запрос, не так ли?

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() для каждого результата.

2 голосов
/ 28 декабря 2011

Вы можете использовать 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().

1 голос
/ 28 декабря 2011

Используйте .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();
0 голосов
/ 28 декабря 2011

Что вы можете сделать, это в

foreach ( Comment item in StreamItemComments)

добавить каждое уведомление в Dictionary<user,msg>

и иметь другой foreach key в словаре впоследствии цикл для отправки фактического сообщения пользователю.Это обеспечит отправку только одного сообщения на пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...