0

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

4

3 回答 3

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());
于 2013-06-18T10:10:54.713 回答
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();

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

于 2013-06-18T08:53:55.623 回答
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();
于 2013-06-18T08:56:50.590 回答