Answers:
这取决于具体情况的需要。例如,假设以下条件,则字典方法将是相当不错的:
如果以上情况都不适合您,请使用方法Any()
:
Item wonderIfItsPresent = ...
bool containsItem = myList.Any(item => item.UniqueProperty == wonderIfItsPresent.UniqueProperty);
这将在列表中进行枚举,直到找到匹配项或到达末尾为止。
只需使用Contains方法。请注意,它基于相等函数工作Equals
bool alreadyExist = list.Contains(item);
您确定在这种情况下需要列表吗?如果您要在列表中填充许多项目,则使用myList.Contains
或会降低性能myList.Any
。运行时间将是平方。您可能要考虑使用更好的数据结构。例如,
public class MyClass
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
public class MyClassComparer : EqualityComparer<MyClass>
{
public override bool Equals(MyClass x, MyClass y)
{
if(x == null || y == null)
return x == y;
return x.Property1 == y.Property1 && x.Property2 == y.Property2;
}
public override int GetHashCode(MyClass obj)
{
return obj == null ? 0 : (obj.Property1.GetHashCode() ^ obj.Property2.GetHashCode());
}
}
您可以通过以下方式使用HashSet:
var set = new HashSet<MyClass>(new MyClassComparer());
foreach(var myClass in ...)
set.Add(myClass);
当然,如果对等式的定义MyClass
是“通用的”,则无需编写IEqualityComparer
实现。您可以覆盖GetHashCode
并且Equals
在类本身中。
还要提到的另一点是,您应确保相等性函数符合您的期望。您应该重写equals方法,以设置对象的哪些属性必须匹配才能将两个实例视为相等。
那你就可以做mylist.contains(item)
这是一个快速的控制台应用程序,描述了如何解决问题的概念。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
public class myobj
{
private string a = string.Empty;
private string b = string.Empty;
public myobj(string a, string b)
{
this.a = a;
this.b = b;
}
public string A
{
get
{
return a;
}
}
public string B
{
get
{
return b;
}
}
}
class Program
{
static void Main(string[] args)
{
List<myobj> list = new List<myobj>();
myobj[] objects = { new myobj("a", "b"), new myobj("c", "d"), new myobj("a", "b") };
for (int i = 0; i < objects.Length; i++)
{
if (!list.Exists((delegate(myobj x) { return (string.Equals(x.A, objects[i].A) && string.Equals(x.B, objects[i].B)) ? true : false; })))
{
list.Add(objects[i]);
}
}
}
}
}
请享用!