2017-09-20 5 views
-2

このアプリケーションでは、動物を列車に入れたいと思っています。動物には6種類あります。大型肉食獣、中型肉食服、小型草食動物、中型草食動物、小型草食動物。私はそれらを正確な順序で私のリストに入れたいと思います。これはどうすればいいですか?私のクラスの2つのプロパティでリストを注文するには

これは私の動物クラスです:

パブリックブール肉食動物。

public Size size; 

    public Animal(bool carnivore, Enum size) 
    { 
     this.carnivore = carnivore; 
     this.size = (Size) size; 
    } 

これは私がそれらを注文したいクラスです:これは列挙型である

public List<Animal> Animals = new List<Animal>(); 

     public List<Wagon> Wagons = new List<Wagon>(); 

     public void Arrange() 
     { 
      Wagon w = new Wagon(); 
      Wagons.Add(w); 
      foreach (Animal animal in Animals.ToList()) 
      { 
       foreach (Wagon wagon in Wagons.ToList()) 
       { 
        if (wagon.addAnimal(animal)) 
        { 
         wagon.addAnimal(animal); 
         Animals.Remove(animal); 
         break; 
        } 
        else 
        { 
         Wagon wag = new Wagon(); 
         wag.addAnimal(animal); 
         Animals.Remove(animal); 
         Wagons.Add(wag); 
        } 
       } 
      } 
     } 
    } 

public enum Size 
    { 
     Small = 1, 
     Medium = 3, 
     Large = 5 
    } 

私はによって、その後のもので、いくつかの順序を見つけたが、彼らは動作していないようです。私が私のように見える質問を見落とせば、すみません。

ありがとうございました!

+0

「彼らはうまくいかない」とはどういう意味ですか?あなたはそのアプローチでどんな問題を見ていますか?列挙型サイズを共有できますか? Orderを使用したコードを共有する –

+0

enumの宣言を投稿してください。実際には、列挙型の値を動物が望む順序で並べ替えるだけです。そうすればうまくいくはずです。 –

+1

で注文を呼び出すときに昇順または降順を指定するのを忘れないでください順序が重要であるか、または動物を6個のワゴンに分けたいだけですか?だから、実際には 'GroupBy'が最初に良いアプローチになるでしょう。 –

答えて

1

名前空間System.Linqには、リストを処理するための非常に便利な拡張メソッドと、一般的にIEnumerables<T>が含まれています。

あなたが希望として、あなたはこの使用することができますソートするには:carnivorityとサイズによって6台のワゴンにあなたの動物を分離するために

Animals.OrderBy(a => a.carnivore).ThenBy(a => a.size); 
+2

これはenumの宣言に強く依存します。 –

+0

これは 'OrderByDescending(a => a.carnivore)'でなければならず、その列挙は難しいかもしれません。 Ifがこの順序で定義されている場合:Large、Medium、Small、それであなたは大丈夫です。この順序で定義されている場合:Small、Medium、Large、ThenByDescendingを再度使用できます。他の注文の場合は、いくつかのフープを飛び越えなければなりません。 –

+0

@MongZhuもちろん、列挙型が対応する整数値で順にレイアウトされていると仮定します。 –

0

を、あなたは、LINQのGroupByを使用することができます。

public void Arrange() 
{ 
    Wagons.AddRange(
      Animals.GroupBy(animal => new {animal.carnivore, animal.size}) 
        .Select(g => 
         { 
          Wagon wagon = new Wagon(); 
          foreach(Animal animal in g) 
           wagon.addAnimal(animal); 
          return wagon; 
         })); 
} 

あなたがすることができますコースをワゴンに投影する前に並べ替える:

public void Arrange() 
{ 
    var groupedAnimals = Animals.GroupBy(animal => new {animal.carnivore, animal.size}); 
    var orderedGroups = groupedAnimals.OrderBy(g => g.carnivore).ThenBy(g => g.size); 

    Wagons.AddRange(orderedGroups.Select(g => 
         { 
          Wagon wagon = new Wagon(); 
          foreach(Animal animal in g) 
           wagon.addAnimal(animal); 
          return wagon; 
         })); 
} 

しかし、結果の順序は今やsize enumの宣言に依存します。

関連する問題