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

我不需要声明并行数组,不需要断言我的数组长度相同,不需要使用索引来取出项目。

我觉得在 C# 中使用 LINQ 可以做到这一点,但我不知道它可能是什么。是否有一些简单的方法可以遍历多个关联的集合?

编辑:

我认为这会更好一些 - 至少在我可以在声明时手动压缩集合并且所有集合都包含相同类型的对象的情况下:

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 中,他们向 IEnumerable 添加了“Zip”扩展方法,因此您的代码可能类似于:

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

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

这是一篇关于 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

如果您只想声明内联列表,您可以一步完成:

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 回答
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 回答