4

私のアプリケーションでは、値 X の N 倍を印刷する必要があります。

だから、私はこれを行うことができます:

Dictionary<int, string> toPrint = new Dictionary<int, string>();
toPrint.Add(2, "Hello World");

...そして後で、この情報を使用して、テキスト値「Hello World」を含む 2 ページを印刷できます。

私が抱えている問題は、ディクショナリが最初の値をキーにすることを本当に望んでいることです:

Dictionary<TKey, TValue>

したがって、テキスト値「Hello World」を含む 2 ページを追加し、次に「Goodbye World」を含む別の 2 ページを追加する場合、問題が発生します。どちらも TKey 値が 2 であり、ランタイム エラー ("アイテム同じキーがすでに追加されています」)。

エラーの原因となるロジック:

Dictionary<int, string> toPrint = new Dictionary<int, string>();
toPrint.Add(2, "Hello World");
toPrint.Add(2, "Goodbye World");

私はまだこの概念/ロジックが機能する必要がありますが、キーのために Dictionary 型を使用できないことは明らかです。

誰もが回避策のアイデアを持っていますか?

4

4 に答える 4

15

Tuple はこの仕事に最適だと思います。

List<Tuple<int, string>> toPrint = new List<Tuple<int, string>>();
toPrint.Add(new Tuple<int, string>(2, "Hello World"); 
toPrint.Add(new Tuple<int, string>(2, "Goodbye World"); 

そして...これを自己完結型のクラスに簡単にラップできます。

public class PrintJobs
{
  // ctor logic here


  private readonly List<Tuple<int, string>> _printJobs = new List<Tuple<int, string>>();

  public void AddJob(string value, int count = 1) // default to 1 copy
  {
    this._printJobs.Add(new Tuple<int, string>(count, value));
  }

  public void PrintAllJobs()
  {
    foreach(var j in this._printJobs)
    {
      // print job
    }
  }
}

}

于 2012-06-30T12:42:55.250 に答える
13

この場合、 List<T> を使用するだけで十分です

class PrintJob
{
    public int printRepeat {get; set;}
    public string printText {get; set;}
    // If required, you could add more fields
}

List<PrintJob> printJobs = new List<PrintJob>()
{
    new PrintJob{printRepeat = 2, printText = "Hello World"},
    new PrintJob{printRepeat = 2, printText = "Goodbye World"}
}

foreach(PrintJob p in printJobs)
    // do the work
于 2012-06-30T12:43:50.173 に答える
1

辞書を使用できますが、キーは int ではなく文字列にする必要があります。それは結局のところユニークなものです!

つまり、ルックアップを行っていないため、辞書は不適切です。ただし、この状況ではスティーブの答えがおそらく最適です。

于 2012-06-30T12:52:06.150 に答える
0

ここにはいくつかのオプションがあると思います...

1.)シナリオでは、文字列自体がキーであるように見えるため、パラメーターの順序を逆にすることができます

new Dictionary<string, int> ()

2.)あなたの状況で意味がある場合は、タプルまたはカスタムクラス/構造体を使用してください。タプルの使い方はChrisさんが既にお見せしているので、私が考えている「クラス解法」をお見せします。

public class MyClass
{
    public string MyTextToPrint { get;set; }
    public string NumberOfPrints { get;set; }
    // any other variables you may need
}

そして、これらのクラスのリストを作成するだけで、タプルとほとんど同じように機能します。これは、より標準化された方法です。これは、他の場所でも同じ機能が必要になるか、データをさらに操作したい場合があるためです。

于 2012-06-30T12:51:16.840 に答える