迭代2个列表

Ben*_*man 5 .net c# .net-3.5 c#-3.0

我有一个List<T1>项目和第二个List<T2>项目.两个列表都按属性A按字母顺序排序.我知道项目列表List<T2>是其中的一个子集,List<T1>并且没有List<T2>存在的项目List<T1>.

我需要迭代List<T1>并在每次匹配变量时更改变量List<T2>.什么是最快和最好的方法?我假设我需要迭代两个列表,但我知道做一个嵌套的foreach没有意义.

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)第二个列表是第一个列表的子集.


SLa*_*aks 5

如果列表不是太大,这种最简单的方法是调用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)

如果列表非常大,则应测量每个选项的性能并进行相应选择.
否则,请选择最简单的第一个选项之一.