English 中文(简体)
用于迭代相关值集的模式是什么?
原标题:
  • 时间:2009-03-06 01:37:48
  •  标签:

这是很常见的事情 - 特别是在您试图让您的代码更加数据驱动的情况下 - 需要迭代关联的集合。例如,我刚刚完成了一个类似于这样的代码片段:

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
}
问题回答

在.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()重载),但没有一个像简单的for迭代器一样干净。

这是一篇关于Zip的博客文章,以及一种自己实现它的方法。在此期间应该会帮助您。

创建结构体?

struct Item
{
    string entityType;
    string dateField;
}

与你的 Pythonic 解决方案基本相同,除了类型安全。

这实际上是对其他主题的变化,但这也会有所帮助...

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);
}

您可以使用一对与通用列表。

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

如果您只想在一行中声明列表,可以在一步中完成:

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
}

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





相关问题
热门标签