2013-06-18 50 views
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); 
     } 
    } 

有沒有錯誤,我只是不刪除元素。 我有一個345元件和B. 3元件在乙 A匹配1個元件 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

您能定義'不工作'嗎?調試器是否會引發錯誤? – DGibbs

+0

我知道這不是問題,但是您應該反過來測試Od_Scan == Od_Done.NoOrdre.ToString()&&!String.IsNullOrWhiteSpace - 首先將空或空格檢查。 – Gordon

+0

而且,您是否查看了Temp_XX_Egal列表?它們是否包含你期望的內容? – Gordon

回答

0

我我不是很確定,我完全理解這個問題,但是如果你的話我已經設法將列表A中但列表B中的所有元素放入單獨的列表中,那麼您肯定可以將List A的部件切換到列表B,並且它會產生相同的結果?

開關全部列表A的 - 名單B 交換機所有列表B的 - 所有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(); 

這可能是不正確的,甚至接近了答案,我很新編程,只是想我可以嘗試和幫助,希望這有助於。

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