C# 4.0 を使用しています。
リストからいくつかの要素を削除したい。
リストA(タイプ文字列)とリストB(タイプT)があります。
リストAにあるがリストBにはないすべての要素を取得したい-> Temp_Od_Scanに保存します(動作します)
リストBにあるがリストAにはないすべての要素-> Temp_Od_Donneに保存します(機能しません)
このコードは正常に動作します (リスト A にあるがリスト B にはないすべての要素を取得します):
 bool Is_Egal = true;                 
                 foreach (string Od_Scan in Ordre_Scan)
                 {                    
                     foreach (Pers_Compare Od_Done in Outils.Get_Ordre_Donne())
                     {
                         if (Od_Scan == Od_Done.NoOrdre.ToString() && !String.IsNullOrWhiteSpace(Od_Done.NoOrdre))
                         {
                             Temp_Od_Scan_Egal.Add(Od_Scan);
                         }
                         else
                         {
                             Is_Egal = false;
                         }
                     }
                 }
                 Temp_Od_Scan = Ordre_Scan.Except(Temp_Od_Scan_Egal).ToList();
しかし、このコードは機能しません (リスト B にあるがリスト A にはないすべての要素)。要素は削除されません。
 foreach (Pers_Compare Od_Done in Outils.Get_Ordre_Donne())
             {
                 foreach (string Od_Scan in Ordre_Scan)
                 {
                     if (Od_Done.NoOrdre == Od_Scan)
                     {
                         Temp_Od_Donne_Egal.Add(Od_Done);
                     }
                     else
                     {
                         Is_Egal = false;                        
                     }
                 }                    
             }
             Temp_Od_Donne = Outils.Get_Ordre_Donne().Except(Temp_Od_Donne_Egal).ToList();
そして、友人のグーグルに尋ねたところ、うまくいかない別の解決策が見つかりました:
 Temp_Od_Donne = Outils.Get_Ordre_Donne();
                 foreach (Pers_Compare donneexist in Temp_Od_Donne_Egal) Temp_Od_Donne.Remove(donneexist); 
またはこのように:
 Temp_Od_Donne.RemoveAll(i => Temp_Od_Donne_Egal.Contains(i));
またはこのように:
var list1 = Outils.Get_Ordre_Donne().Where(o => Ordre_Scan.Any(s => s != o.NoOrdre));
私のクラスは次のようになります。
 public class Pers_Compare 
    {
        string _NoLV;
        public string NoLV
        {
            get { return _NoLV; }
            set { _NoLV = value; }
        }
        string _NoOrdre;
        public string NoOrdre
        {
            get { return _NoOrdre; }
            set { _NoOrdre = value; }
        }
        public int CompareTo(string other)
        {
            return this.NoOrdre.CompareTo(other);
        }
    }
エラーはありません。要素を削除しないだけです。A に 345 要素、B に 3 要素があります。A の 1 要素は B の 1 要素と一致するため、リスト Temp_Od_Donne は 2 (正しい) を返しますが、リスト Temp_Od_Donne は 345 を返します (正しくない、344 を返す必要があります)。
しかし、奇妙なのはこのループについてです:
 Temp_Od_Donne = Outils.Get_Ordre_Donne();
                 foreach (Pers_Compare donneexist in Temp_Od_Donne_Egal)
                 {
                     Temp_Od_Donne.Remove(donneexist);  
                 }  
ループ Temp_Od_Donne.count = 345 に入る前と、ループ Temp_Od_Donne.count = 345 に入った後...奇妙な...