End*_*ssa 12
对于这种类型的东西,我更喜欢双行走环.请参阅下面的示例.
var super = new List<Contact>();
super.Add(new Contact() {Name = "John"});
super.Add(new Contact() {Name = "Larry"});
super.Add(new Contact() {Name = "Smith"});
super.Add(new Contact() {Name = "Corey"});
var sub = new List<Contact>();
sub.Add(new Contact() {Name = "Larry"});
sub.Add(new Contact() {Name = "Smith"});
var subCount = 0;
for(int i=0; i<super.Count && subCount < sub.Count; i++)
{
if (super[i].Name == sub[subCount].Name)
{
Act(super[i], sub[subCount]);
subCount++;
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里Act(...)执行您要执行的任何操作.
循环每次都会递增超级列表,但只有在找到匹配项时才会递增子列表.
请注意,这仅适用于您的两个假设.1)列表都是排序的,2)第二个列表是第一个列表的子集.
如果列表不是太大,这种最简单的方法是调用Contains:
foreach(var item in list1) {
if (list2.Contains(item) {
//Do something
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过BinarySearch使用自定义调用来加快速度IComparer<T>,如下所示:
class MyComparer : IComparer<YourClass> {
private MyComparer() { }
public static readonly MyComparer Instance = new MyComparer();
public int CompareTo(YourClass a, YourClass b) {
//TODO: Handle nulls
return a.SomeProperty.CompareTo(b.SomeProperty);
}
}
foreach(var item in list1) {
if (list2.BinarySearch(item, MyComparer.Instance) >= 0) {
//Do something
}
}
Run Code Online (Sandbox Code Playgroud)
在.Net 3.5中,您可以通过以下方式使其更快HashSet<T>:
var hashset = new HashSet<YourClass>(list2);
foreach(var item in list1) {
if (hashset.Contains(item) {
//Do something
}
}
Run Code Online (Sandbox Code Playgroud)
如果列表非常大,则应测量每个选项的性能并进行相应选择.
否则,请选择最简单的第一个选项之一.