是否有与Python';.NET IEnumerable的s enumerate()

是否有与Python';.NET IEnumerable的s enumerate(),.net,ienumerable,.net,Ienumerable,我找不到相关的问题 在python中,您可以轻松地循环一个序列(list,generator等),同时收集迭代的索引,这要归功于enumerate(seq),如下所示: 枚举([“toto”、“titi”、“tututu]”)中(i,项)的>>: ... 打印i,项目 ... 0托托 1提提 2图图 IEnumerable是否有类似的功能,例如,在IEnumerable中转换IEnumerable (由于Select()中的正确函数,我知道这将很容易完成。但如果它存在,我宁愿使用它:)

我找不到相关的问题

python
中,您可以轻松地循环一个序列(
list
generator
等),同时收集迭代的索引,这要归功于
enumerate(seq)
,如下所示:

枚举([“toto”、“titi”、“tututu]”)中(i,项)的
>>:
...     打印i,项目
...
0托托
1提提
2图图
IEnumerable是否有类似的功能,例如,在
IEnumerable
中转换
IEnumerable

(由于
Select()
中的正确函数,我知道这将很容易完成。但如果它存在,我宁愿使用它:)

更新 仅供参考,我对这种可能性很好奇,可以这样做:“给我满足此条件的最后一个项目的索引”,然后通过以下方式完成:

myEnumeration.First(t => some condition on t.Item2 ... ).Item1;

至于一个特定的函数,它将满足您的要求,我不知道.NET是否包含它。然而,最快的方法就是这样做:

intid=0;
foreach(someList中的变量元素)
{
…多斯塔夫。。。
id++;
}
编辑:这里有一个函数可以根据您的要求执行,使用
yield return
,但它的缺点是每次迭代需要一个GC分配:

public static IEnumerable<Tuple<int, T>> Enumerate<T>(IEnumerable<T> list)
{
    int id = 0;
    foreach(var elem in list)
    {
        yield return new Tuple<int, T>(id, elem);
        id++;
    }
}
公共静态IEnumerable枚举(IEnumerable列表)
{
int id=0;
foreach(列表中的变量元素)
{
返回新的元组(id,elem);
id++;
}
}

以下是我对自己问题的回答

如果它不存在,我也可以这样做,而不必为/
foreach实际编写

var items=新列表{“toto”、“titi”、“tututu”};
枚举变量=项。选择((x,i)=>新元组(i,x));
foreach(枚举中的变量t)
{
WriteLine(String.Format(“{0}:{1}”,t.Item1,t.Item2));
}
其中打印:

0:toto
1:titi
2:图图

这是一条单行线。。。一个丑陋的,但无论如何是一行:)

而不是使用
元组(这是一个类),你可以使用
KeyValuePair
,它是一个结构。这将避免枚举时的内存分配(不是因为它们非常昂贵,但仍然如此)

公共静态IEnumerable枚举(此IEnumerable项){
返回项。选择((项,项)=>newkeyvaluepair(项,项));
}
C#7最终让您能够以优雅的方式完成此任务:

静态类扩展
{
公共静态IEnumerable枚举(
这是一个可数输入,
int start=0
)
{
int i=开始;
foreach(输入中的var t)
收益率(i++,t);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var s=新字符串[]
{
“阿尔法”,
“好极了”,
“查理”,
“三角洲”
};
foreach(s.Enumerate()中的变量(i,o))
Console.WriteLine($“{i}:{o}”);
}
}

这里有一个扩展方法,它将返回元组序列,其中第一项是序列中的数字,第二项是源序列中的值。


谢谢,这实际上就是我现在正在使用的,但是它让我感觉有点尴尬(特别是在VB.NET中编写时…但是VB.NET中涉及泛型的哪些代码看起来不错?)来说明:
Dim lastAccountDiscountIndex=availableDiscounts.Select(函数(d,I)New KeyValuePair(GlobalDiscountDefaultValue,Int32)(d,I))_u.Last(Function(kvp)kvp.Key.Source.Type=GlobalDiscountSourceType.QuotationAccount)u.Value
那么,不要使用VB.NET;)-我知道这不是很有建设性,但是VB.NET在泛型中有主要的语法缺陷。顺便说一句,从.NET 4开始,你至少应该能够删除这些。我希望我有一个选择:'(.实际上,在这种情况下,我不能删除那些下划线。如果我想在每行的末尾保留点,并在下面一行上保留方法,我可以,但我只是觉得不对……是的,我想是这样(你没有选择权)。无论如何,与延续字符和行首的点相比,我更喜欢行尾的点(这是我的风格g)。很抱歉,没有提供更多帮助。+1表示
yield
return,我假设它与
Select()
方法中的函数中返回的内容相同。(见我下面的答案,索引的递增是在
Select()
的一个签名中为您完成的)由于结构与类的关系,我将用KeyValuePair标记一个作为答案。但感谢这一点:-)在本网站上,只使用代码的答案通常不受欢迎。请编辑您的答案,以包含一些对代码的注释或解释。解释应回答以下问题:它是做什么的?它是如何做的?它去哪里了?它如何解决OP的问题?请参阅:。谢谢!可能添加此内容以获得完整性。以下是使用des的一种方法构造:也是刚刚发现的。
Microsoft.Toolkit.HighPerformance
有一个“Enumerate()”扩展方法
public static IEnumerable<Tuple<int, T>> Enumerate<T>(this IEnumerable<T> source, int start = 0)
{
    return source.Select((value, index) => new Tuple<int, T>(index + start, value));
}
var source = new[] { "apple", "pear", "banana", "orange", "lemon" };
var enumerated1 = source.Enumerate();   // { (0, "apple"), (1, "pear"), (2, "banana"), (3, "orange"), (4, "lemon") }
var enumerated2 = source.Enumerate(3);  // { (3, "apple"), (4, "pear"), (5, "banana"), (6, "orange"), (7, "lemon") }