5

関連するコレクションを反復処理する必要があるのは、特にコードをよりデータ駆動型にしようとする場合によくあることです。たとえば、次のようなコードを書き終えました。

string[] entTypes = {"DOC", "CON", "BAL"};
string[] dateFields = {"DocDate", "ConUserDate", "BalDate"};
Debug.Assert(entTypes.Length == dateFields.Length);

for (int i=0; i<entTypes.Length; i++)
{
    string entType = entTypes[i];
    string dateField = dateFields[i];
    // do stuff with the associated entType and dateField
}

Python では、次のように記述します。

items = [("DOC", "DocDate"), ("CON", "ConUserDate"), ("BAL", "BalDate")]
for (entType, dateField) in items:
   # do stuff with the associated entType and dateField

並列配列を宣言する必要はありません。配列が同じ長さであることを主張する必要もありません。項目を取得するためにインデックスを使用する必要もありません。

LINQ を使用して C# でこれを行う方法があるように感じますが、それが何であるかわかりません。関連する複数のコレクションを反復処理する簡単な方法はありますか?

編集:

これは少し良いと思います-少なくとも、宣言時にコレクションを手動で圧縮する余裕があり、すべてのコレクションに同じタイプのオブジェクトが含まれている場合:

List<string[]> items = new List<string[]>
{
    new [] {"DOC", "DocDate"},
    new [] {"CON", "ConUserDate"},
    new [] {"SCH", "SchDate"}
};
foreach (string[] item in items)
{
    Debug.Assert(item.Length == 2);
    string entType = item[0];
    string dateField = item[1];
    // do stuff with the associated entType and dateField
}
4

5 に答える 5

3

.NET 4.0 では、"Zip" 拡張メソッドが IEnumerable に追加されているため、コードは次のようになります。

foreach (var item in entTypes.Zip(dateFields, 
    (entType, dateField) => new { entType, dateField }))
{
    // do stuff with item.entType and item.dateField
}

今のところ、最も簡単な方法は for ループのままにしておくことだと思います。「他の」配列を参照できるトリックはありますが (たとえば、インデックスを提供する Select() のオーバーロードを使用して)、単純な for iterator ほどクリーンなものはありません。

Zip に関するブログ記事と、Zip を自分で実装する方法を次に示します。それまでの間、あなたを動かすべきです。

于 2009-03-06T01:46:24.240 に答える
2

構造体を作成しますか?

struct Item
{
    string entityType;
    string dateField;
}

タイプセーフを除いて、Pythonic ソリューションとほとんど同じです。

于 2009-03-06T01:46:37.610 に答える
1

これは実際には他のテーマのバリエーションですが、これもうまくいくでしょう...

var items = new[]
          {
              new { entType = "DOC", dataField = "DocDate" },
              new { entType = "CON", dataField = "ConUserData" },
              new { entType = "BAL", dataField = "BalDate" }
          };

foreach (var item in items)
{
    // do stuff with your items
    Console.WriteLine("entType: {0}, dataField {1}", item.entType, item.dataField);
}
于 2009-03-15T21:42:07.407 に答える
0

ペアと一般的なリストを使用できます。

List<Pair> list = new List<Pair>();

list.Add(new Pair("DOC", "DocDate"));
list.Add(new Pair("CON", "ConUserDate"));
list.Add(new Pair("BAL", "BalDate"));

foreach (var item in list)
{
    string entType = item.First as string;
    string dateField = item.Second as string;

    // DO STUFF
}

Pair は Web.UI の一部ですが、独自のカスタム クラスまたは構造体を簡単に作成できます。

于 2009-03-06T01:48:18.900 に答える
0

リストをインラインで宣言したいだけなら、ワンステップでそれを行うことができます:

var entities = new Dictionary<string, string>() {
    { "DOC", "DocDate" },
    { "CON", "ConUserDate" },
    { "BAL", "BalDate" },
};
foreach (var kvp in entities) {
    // do stuff with kvp.Key and kvp.Value
}

それらが他のものから来ている場合、さまざまなデータ構造から辞書を構築するための拡張メソッドがたくさんあります。

于 2009-03-06T06:35:32.907 に答える