迭代关联值集的模式是什么?

时间:2009-03-06 01:37:48

标签: c# linq iteration

这很常见 - 尤其是当您尝试使代码变得更加数据化时 - 需要迭代关联的集合。例如,我刚刚编写了一段代码如下:

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
}

5 个答案:

答案 0 :(得分:3)

在.NET 4.0中,他们为IEnumerable添加了一个“Zip”扩展方法,因此您的代码可能如下所示:

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

目前我认为最简单的方法是将其作为for循环。有一些技巧可以引用“其他”数组(例如,通过使用提供索引的Select()重载),但它们都不像迭代器那样简单。

Here's a blog post about Zip as well as a way to implement it yourself。应该让你在此期间去。

答案 1 :(得分:2)

创建结构?

struct Item
{
    string entityType;
    string dateField;
}

与Pythonic解决方案几乎相同,除了类型安全。

答案 2 :(得分: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);
}

答案 3 :(得分: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的一部分,但您可以轻松创建自己的自定义类或结构。

答案 4 :(得分: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
}

如果它们来自其他东西,我们有一堆扩展方法来构建来自各种数据结构的字典。