【问题标题】:Remove some element from the list从列表中删除一些元素
【发布时间】:2013-06-14 09:22:52
【问题描述】:

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

【问题讨论】:

  • 你能定义not work吗?调试器会抛出错误吗?
  • 我知道这不是问题,但您可能应该反转测试 Od_Scan == Od_Done.NoOrdre.ToString() && !String.IsNullOrWhiteSpace - 首先检查空或空格。
  • 还有,您查看 Temp_XX_Egal 列表了吗?它们是否包含您所期望的内容?
  • 是的,在 Temp_XX_Egal 列表中我有我所期望的

标签: c# list removeall


【解决方案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());

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      我不太确定我是否完全理解了这个问题,但是如果您已设法将列表 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();
      

      这可能不正确,甚至不接近答案,我对编程很陌生,只是想我可以尝试提供帮助,希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 2021-12-09
        • 1970-01-01
        • 2018-08-15
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多