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 に入った後...奇妙な...