2017-12-15 21 views
-1

私は.Except()を使用して、LINQを使って次のようにC#内の2つのListの違いを比較しました。LINQを置き換える2つのリスト、.Except()アルゴリズムを比較する

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

しかし、私の会社は、我々は、.NET 3. そこで私はEnumerable.Exceptを使用することはできません上にある、LINQを使用していません。 と同じ目的を達成するにはどうすればよいですか、または.Except()のアルゴリズムをどうやって書くことができますか?

+2

あなたが使用しているIDEは無関係です... – Equalsk

+2

あなたの会社が使っている.NETフレームワークのバージョンは何ですか?なぜ> = 3.5を使うことができないのですか? –

+0

".Except()のアルゴリズムはどのように書くことができますか?"それについて考えてみましょう... 2つのループでは、あるリストを別のリストと比較し、他のリストに存在しない要素だけを抽出します。 –

答えて

2

あなたは、これはsourceで、何らかの理由でLINQを使用することができない場合は、次の

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>(必要に応じて[OK]を、まだ.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; 
     } 
    } 
} 
+0

ありがとう、本当に助けてくれます。 LINQは人々を私のように考えるのを怠惰にする。 –

+0

@ChanYoongHon:.NET3を使用している場合は、最後の辞書アプローチを使用できるはずです。 –

+0

概要 –

1

Except()はSystem.Linqの拡張メソッドです。ファイル内でこの名前空間を参照できる場合は、その名前空間を使用できるはずです。これはVisualスタジオを必要としません。コンパイラにアクセスできる限り、コードをコンパイルして実行することができます。

関連する問題