0

City クラスがあり、その中に Detail クラスがあります。

public class City {

        public string PartitionKey { get; set; }
        public string RowKey { get; set; }
        public string Notes { get; set; }

        public class Detail
        {
            public Detail()
            {
                ImageFile = String.Empty;
                Explanation = new HtmlText();
            }
            public string ImageFile { get; set; }
            public HtmlText Explanation { get; set; }
        }

}

私のコードには、詳細の数を確認する行がいくつかあり、10 未満の場合は、新しい City.Details を追加します。これを行うために以下のコードを使用していますが、いくつかの異なるメソッドに配置されており、きれいに見えません。これを簡素化し、チェック、カウント、および基本の City クラスに追加するロジックを追加する方法はありますか?

foreach (int index in Enumerable.Range(0, 10 - vm.Details.Count()))
            {
                vm.Details.Add(new City.Detail());
            }
4

7 に答える 7

2

City クラスに MinReached メソッドと FillDetails メソッドを追加できます。最初のものはすでに最小値に達しているかどうかをチェックし、2 番目のものは新しい詳細を 10 まで追加します。

public bool MinReached()
{
    return this.Details.Count >= 10;
}

public void FillDetails()
{
    for (int i = Details.Count; i <= 10; i++)
        this.Add(new City.Detail());
}
于 2012-05-25T06:01:22.967 に答える
2

常に 10 個の詳細を利用できるようにする必要がある場合は、これらの行で何かを行うことができます

Enumerable.Range(0, count).Select(i => new City.Detail()).ToList();

これは 10 個の詳細専用です。残りを追加して差を計算し、.Concat()それを既存のリストに追加する場合に使用します。

于 2012-05-25T06:04:18.797 に答える
1

他の人が言ったように、次のようなものを使用してください

 while(vm.Details.Count() < 10)
      vm.Details.Add(new City.Detail());

または通常の for コンストラクト

 for(int x = vm.Details.Count(); x < 10; x++)
      vm.Details.Add(new City.Detail());

そうしないと、他の人があなたのコードを読んだとき (または今から 3 か月後にコードを見たとき) に、「え?」という反応が返ってきます。何が起こっているかを自動的に認識するだけではありません。

この問題に対処するには、次の 3 つの方法があります。

1) 作成時に City オブジェクトに 10 個の詳細を追加し、それらを使用して、必要に応じてさらに作成します。

2) 実際には 10 個の詳細がないのに、なぜ 10 個の詳細が必要なのですか? 可能な限り、オブジェクトが何を表しているかを真に表現することが最善です。したがって、より深刻な問題の兆候に過ぎないものを修正しようとしているのかもしれません。でもそうじゃないなら…

3) 他の人が述べたように、このロジックを基本クラスに移動するだけです。

編集: #3 についても、このプロセスを自動化する方法が必要であることを明確にしておかなければなりませんでした。そのため、追加の詳細を埋め込むプロシージャを明示的に呼び出す必要はありません。あなたのコードからは、これを行うように正確に指示する方法を知るのに十分な情報がありませんが、10 の詳細を持つことが重要である理由についてさらに情報を提供したい場合は、さらに支援できると確信しています.

于 2012-05-25T06:10:45.847 に答える
1

あなたの cm 変数の型はわかりませんが、 City クラスに何かを追加したい場合は、 SetDetailSize のような名前の静的メソッドを City クラスに追加して、 Detail オブジェクトのコレクションと強制したいサイズを受け入れることができますコレクションを取得してから、コレクションを渡して City.SetDetailSize メソッドを呼び出すだけです。

于 2012-05-25T06:02:00.467 に答える
1

for ループを使用できない理由

for (int i = 0; i < 10 - vm.Details.Count(); i++) vm.Details.Add(new City.Detail());
于 2012-05-25T05:58:45.850 に答える
0

「..これをLINQを使用して実行すると、forループが完全に不要になります」。確かにlinqでそれを行うことはできますが、それはループが発生しないという意味ではありません。ForEachlinq演算子を使用します。ただし、このコードは、linqスタイルであることを除けば、あなたが書いたものと似ています。

LINQコード

Enumerable.Range(0, 10-vm.Details.Count()).ToList().ForEach(counter=>vm.Details.Add(new City.Detail());

編集

これで問題が解決すると思います。クラスが開始したらすぐに、デフォルトで10都市を埋めます。カウンターを使用して、ダミー要素がいくつあるかを確認します。ユーザーが詳細を追加したら、ダミーをユーザーの入力に置き換えます。これを基本クラスに入れると、他のすべての場所に詳細を追加することを忘れることができます

public class City 
{

   int counter = 0;
   public City()
   {
       //fill 10 elements by default
       Enumerable.Range(0, 10).ToList().ForEach(counter =>vm.Details.Add(new City.Detail());
   }
.
.
}

//Now define your add method as following
public void AddDetails(Details d)
{
   //remove the dummy element  
   vm.Details.RemoveAt(counter);
  //add original element and increase the counter, so next element would be added at next index
   vm.Details.insert(counter++, d);
}
于 2012-05-25T06:05:48.217 に答える
0

もう 1 つのオプションは、List コレクションの拡張メソッドを作成することです。これにより、アプリケーション内のどこからでも、List of Detail オブジェクトのメソッドを呼び出すことができます。以下をせよ:

public static class ExtensionMethods
{
     public static void SetDetailSize(this List<City.Detail> details, int size)
     {
          for (int i = 0; i < size - details.Count; i++) 
             details.Add(new City.Detail());    
     }
}

これにより、City.Detail オブジェクトの List がある場所であればどこでも次の呼び出しを行うことができるため、コードの重複の問題が解決されます。

vm.Details.SetDetailSize(10);

ExtensionMethods クラスの名前空間を参照する using ステートメントがあることを確認してください。

于 2012-05-25T14:06:55.840 に答える