我使用 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...奇怪...