从列表中删除一些元素

时间:2013-06-18 08:35:18

标签: c# list removeall

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

3 个答案:

答案 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();