2017-12-15 1 views
-1

Ich verwendete .Except(), um den Unterschied von zwei Listen in C# zu vergleichen, indem Sie LINQ wie folgt verwenden.Vergleich der Unterschiede von zwei Listen, .Except() -Algorithmus zum Ersetzen von LINQ

List<string> APromotionProduct= GetAPromotionProduct(PrdA); 
List<string> BPromotionProduct = GetBPromotionProduct<string>(PrdB); 
List<string> tempList = new List<string>(); 
tempList = PromotionProduct.Except(XMLPromotionProduct).ToList(); 

Allerdings ist meine Firma mit LINQ nicht, wir sind auf .NET 3. deshalb ich nicht Enumerable.Except verwenden können. Wie kann ich den gleichen Zweck erreichen oder wie kann ich den Algorithmus für .Except() schreiben.

+2

Welche IDE Sie verwenden, ist irrelevant ... – Equalsk

+2

Welche Version des .NET-Frameworks verwendet Ihr Unternehmen? Warum kannst du nicht eins> = 3.5 benutzen? –

+0

"Wie kann ich den Algorithmus für .Except() schreiben." Denken Sie darüber nach ... in 2 Schleifen würden Sie eine Liste mit einer anderen vergleichen und nur die Elemente extrahieren, die in der anderen nicht vorhanden sind. –

Antwort

2

Wenn Sie LINQ aus irgendeinem Grund nicht verwenden können, ist dies der 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; 
} 

So könnte man eine HashSet<string> (ok, noch benötigt .NET 3.5) verwenden:

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; 
} 

dann können Sie verwenden:

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

Wenn Sie auch auf .NET sind 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; 
     } 
    } 
} 
+0

Danke, du hilfst mir wirklich. LINQ macht Leute faul, wie ich zu denken. –

+0

@ChanYoongHon: Wenn Sie auf .NET3 sind, sollten Sie den letzten Wörterbuchansatz verwenden können. –

+0

Schemelter Akzeptiert –

1

Ausgenommen() ist eine Erweiterungsmethode von System.Linq. Wenn Sie diesen Namespace in Ihre Datei verweisen können, sollten Sie ihn verwenden können. Dies erfordert kein Visual Studio. Solange Sie Zugriff auf den Compiler haben, können Sie Ihren Code kompilieren und ausführen.

Verwandte Themen