C# 扩展IEnumerable的Select以将源包含在选择器中

C# 扩展IEnumerable的Select以将源包含在选择器中,c#,linq,select,ienumerable,class-extensions,C#,Linq,Select,Ienumerable,Class Extensions,IEnumerable的重载之一是: public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector); 在选择器中,我希望包括源代码。我知道这听起来有悖常理,因为您首先提供了要选择的源代码,但JavaScript也有类似的功能。我想在这里这样的快速情

IEnumerable的重载之一是:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);
在选择器中,我希望包括源代码。我知道这听起来有悖常理,因为您首先提供了要选择的源代码,但JavaScript也有类似的功能。我想在这里这样的快速情况下使用它:

var greetings = new List<string> { "John", "Keith", "Sarah", "Matt" }.Select((name, index, source) => {
    if (name == source.First())
        return $"{name} (Todays Winner)";
    return name;
});
由于Select的selector参数不返回3个值,因此上述选项将出现错误。只有当前对象和索引。我希望它包括来源

我不想先单独创建列表,然后再创建。首先

以下是我在扩展方面所做的努力;我不知道如何实施它

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult, IEnumerable<TSource>> selector)
{
    //not sure what to put in here, must be missing something simple ;(
}
更新

上述情况只是一个虚构的例子。我的实际情况需要使用.Last not.First,所以索引不会有用,因为我们不知道最后一个索引是什么,而不是先使用零。因此,我需要将源代码传回。

这应该可以做到:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TSource>, TResult> selector)
{
    using (var enumerator = source.GetEnumerator()) {
        for (var i = 0 ; enumerator.MoveNext() ; i++) {
            yield return selector(enumerator.Current, i, source);
        }
    }
}
这应该做到:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TSource>, TResult> selector)
{
    using (var enumerator = source.GetEnumerator()) {
        for (var i = 0 ; enumerator.MoveNext() ; i++) {
            yield return selector(enumerator.Current, i, source);
        }
    }
}
这应该起作用:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TSource>, TResult> selector)
{
        int index = 0;
        foreach(var item in source)
        {
            yield return selector(item, index, source);
            index++;   
        }
}
这应该起作用:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TSource>, TResult> selector)
{
        int index = 0;
        foreach(var item in source)
        {
            yield return selector(item, index, source);
            index++;   
        }
}

检查索引为零是正确的,但我真正的代码需要最后一个。在我的例子中应该使用Last。让我试试使用收益率。第一次使用它。是的,在粗糙中,TResult作为返回类型排在最后。干杯。可以用foreach做类似的事情吗?也就是说,一个扩展以某种方式在每个iteration@pnizzle您的意思是类似于另一个答案中所示的方法?@pnizzle经过一些实验,我发现您需要使用自定义列表类来完成此操作。您只需要使该列表实现IEnumerable。检查索引0是正确的,但我真正的代码需要最后一个。在我的例子中应该使用Last。让我试试使用收益率。第一次使用它。是的,在粗糙中,TResult作为返回类型排在最后。干杯。可以用foreach做类似的事情吗?也就是说,一个扩展以某种方式在每个iteration@pnizzle您的意思是类似于另一个答案中所示的方法?@pnizzle经过一些实验,我发现您需要使用自定义列表类来完成此操作。您只需要使该列表实现IEnumerable。