我正在使用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个元素。 B中的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 ...奇怪......
答案 0 :(得分:1)
我希望这会帮助你。 我使用了一些linq查询来解决你的问题。
List<string> Ordre_Scan = "aabb,eeff".Split(',').ToList(); // input for test (guess the scancodes)
List<string> pers_Compare_ScanCodes = "aabb,ccdd,eeff".Split(',').ToList(); // input for test (existing class string values)
List<Pers_Compare> pers_Compare = (from scan_code in pers_Compare_ScanCodes select
new Pers_Compare { NoOrdre = scan_code }).ToList(); // straight to a list to match your problem
var resContains = from pers in pers_Compare
where !string.IsNullOrWhiteSpace(pers.NoOrdre)
&&
Ordre_Scan.Contains(pers.NoOrdre.Trim())
select pers;
var resNotContains = pers_Compare.Except(resContains.ToList());
答案 1 :(得分:0)
我不太确定我完全理解这个问题,但是如果你已经设法将列表A中但不在列表B中的所有元素放入单独的列表中,那么你肯定可以切换你的列表A部分对于列表B,它会产生相同的结果吗?
切换所有列表A - 列表B. 切换所有列表B - 列表A. 切换所有Temp_Od_Scan - Temp_Od_Donne
bool Is_Egal = true;
foreach (Pers_Compare Od_Done in Outils.Get_Ordre_Donne())
{
foreach (string Od_Scan in Ordre_Scan)
{
if (Od_Scan == Od_Done.NoOrdre.ToString() && !String.IsNullOrWhiteSpace(Od_Done.NoOrdre))
{
Temp_Od_Donne_Egal.Add(Od_Done);
}
else
{
Is_Egal = false;
}
}
}
Temp_Od_Donne = Outils.Get_Ordre_Donne().Except(Temp_Od_Donne_Egal).ToList();
这可能不正确甚至接近答案,我对编程很新,只是想我可以尝试帮忙,希望这会有所帮助。
答案 2 :(得分:0)
试试这个:
foreach (Pers_Compare Od_Done in Outils.Get_Ordre_Donne())
{
foreach (string Od_Scan in Ordre_Scan)
{
if (Od_Done.NoOrdre.ToString() == 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();