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 に答える