我有一个名为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类的实例添加到我的自定义列表之前,我想检查它是否已经在列表中。
实现这一目标的最佳方法是什么?
答案 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。