比较两个列表的差异,.Except()算法替换LINQ

时间:2017-12-15 10:01:20

标签: c# algorithm .net-3.0

我曾经使用sendKeys(Keys.ENTER);来比较C#中两个List的差异,使用LINQ,如下所示。

WebElement.sendKeys(Keys.RETURN);

但是,我的公司没有使用LINQ,我们使用的是.NET 3。 因此,我无法使用.Except()。我怎样才能达到同样的目的 或者我如何编写List<string> APromotionProduct= GetAPromotionProduct(PrdA); List<string> BPromotionProduct = GetBPromotionProduct<string>(PrdB); List<string> tempList = new List<string>(); tempList = PromotionProduct.Except(XMLPromotionProduct).ToList(); 的算法。

2 个答案:

答案 0 :(得分:2)

如果由于某种原因你无法使用LINQ,那就是source

static IEnumerable<TSource> ExceptIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer) {
    Set<TSource> set = new Set<TSource>(comparer);
    foreach (TSource element in second) set.Add(element);
    foreach (TSource element in first)
        if (set.Add(element)) yield return element;
}

所以你可以使用HashSet<string>(好的,还需要.NET 3.5):

public static IEnumerable<TSource> ExceptNoLinq<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer) 
{
    HashSet<TSource> set = new HashSet<TSource>(comparer);
    foreach (TSource element in second) set.Add(element);
    foreach (TSource element in first)
        if (set.Add(element)) yield return element;
}

然后你可以使用:

var exceptItems = PromotionProduct.ExceptNoLinq(XMLPromotionProduct);
List<string> resultList = new List<string>(exceptItems);

如果您甚至使用.NET 2:

public static IEnumerable<TSource> ExceptDotNet2<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
{
    var dict = new Dictionary<TSource, bool>(comparer);
    foreach (TSource element in second) dict.Add(element, true);
    foreach (TSource element in first)
    {
        if (!dict.ContainsKey(element))
        {
            dict.Add(element, true);
            yield return element;
        }
    }
}

答案 1 :(得分:1)

Except()是System.Linq的扩展方法。如果您可以在文件中引用此命名空间,那么您应该能够使用它。这并不需要Visual Studio。只要您有权访问编译器,就可以编译并运行代码。