c#检查自定义类是否在列表<t>中

时间:2015-05-13 09:52:04

标签: c#

我有一个名为List<Notifications>的自定义列表。

课程如下:

public class Notification
{
    public enum Type {

        Promotion,
       Other
    }
    public string ID { get; set; }
    public string Headline { get; set; }
    public string Detail { get; set; }
    public Type NotificationType { get; set; }

}

在将Notification类的实例添加到我的自定义列表之前,我想检查它是否已经在列表中。

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用1.。Contains,但是您必须覆盖Equals(+ GethashCode)。

bool contains = list.Contains(someNotificationInstance);

例如:

public class Notification
{
    public enum Type {

        Promotion,
       Other
    }
    public string ID { get; set; }
    public string Headline { get; set; }
    public string Detail { get; set; }
    public Type NotificationType { get; set; }

    public override bool Equals(object obj)
    {
        return obj is Notification && string.Equals(ID, ((Notification)obj).ID);
    }

    public override int GetHashCode()
    {
        return ID == null ? 0 : ID.GetHashCode();
    }
}

2.。)另一种选择是为IEqualityComparer<Notification>提供自定义Contains

public class NotificationComparer : IEqualityComparer<Notification>
{
    public bool Equals(Notification x, Notification y)
    {
        return x.ID == y.ID;
    }

    public int GetHashCode(Notification obj)
    {
        return obj.ID == null ? 0 : obj.ID.GetHashCode();
    }
}

通过这种方式,您无需修改​​原始课程。您可以这样使用它:

bool contains = list.Contains(someInstance, new NotificationComparer());

3。)可能最简单的方法是使用Enumerable.Any

bool contains = list.Any(n => someInstance.ID == n.ID); 

4。)最有效的方法是使用一个集合,如果集合中不允许重复。然后,您可以使用HashSet<T>的第一种或第二种方法:

var set = new HashSet<Notification>(new NotificationComparer());
set.Add(instance1);
bool contains = !set.Add(instance2);

答案 1 :(得分:2)

您可以使用Contains方法进行检查。

if (!mylist.Select(l => l.ID).Contains(mynewid)) {
   var item = new Notifcation();
   item.ID = mynewid;
   item..... // fill the rest

   mylist.Add(item);
}

也许更好的approch将使用Dictionary