这很常见 - 尤其是当您尝试使代码变得更加数据化时 - 需要迭代关联的集合。例如,我刚刚编写了一段代码如下:
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
}
答案 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
}
如果它们来自其他东西,我们有一堆扩展方法来构建来自各种数据结构的字典。