【发布时间】:2017-07-07 02:54:30
【问题描述】:
我在 C# 中创建了一个 Map 函数,以在许多方面发挥作用,因为它在 JavaScript 中等同于项目对象类型。从那以后,我将这些方法重命名为“选择”以用作重载,因此它们感觉更“集成”。这是一个链条,请耐心等待,但受影响的功能看起来像这样......
public static TResult Project<TInput, TResult>(this TInput input, Func<TInput, TResult> projectionMapping)
=> projectionMapping(input);
public static TResult Project<TInput, TAccumulatedValue, TIncrementingValue, TResult>(this TInput input, Func<TInput, TAccumulatedValue, TResult> projectionMapping,
Func<TAccumulatedValue, TIncrementingValue, TAccumulatedValue> accumulator, TAccumulatedValue initialAccumulatorValue, TIncrementingValue increment)
=> projectionMapping(input, accumulator(initialAccumulatorValue, increment));
public static IEnumerable<TResult> Select<TInput, TAccumulatedValue, TIncrementingValue, TResult>(this IEnumerable<TInput> input,
Func<TInput, TAccumulatedValue, TResult> projectionMapping, Func<TAccumulatedValue, TIncrementingValue, TAccumulatedValue> accumulator,
TAccumulatedValue initialAccumulatorValue, TIncrementingValue increment)
=> input.Select(item => item.Project(projectionMapping, accumulator, initialAccumulatorValue, increment));
// This doesn't work.
public static IEnumerable<TResult> Select<TInput, TResult>(this IEnumerable<TInput> input,
Func<TInput, int, TResult> projectionMapping, int initialAccumulatorValue = -1, int increment = 1)
{
return input.Select(projectionMapping, (acc, inc) => acc + inc,
initialAccumulatorValue, increment);
}
我用的是int版本的map方法,里面写了累加器,如下……
MyList.Add(new List<MyObject>(rowValues.Map((val, headerNumber)
=> new MyObject(headerNumber, val), 0, 10)));
问题是,headerNumber 的值永远不会改变(它总是 10) - 累加器运行一次,然后为每个 Mapping 运行,但它不记得它在运行之间的累积。我觉得我在这里遗漏了一些明显的东西,但我看不到树木的树木。
如果我输入(例如)这样的数组...
rowValues = new string[] { "Item 1", "Item 2", "Item 3" };
我希望有一个包含以下数据的 MyObject 项目列表...
- 10 | “第 1 项”
- 20 | “第 2 项”
- 30 | “第 3 项”
【问题讨论】:
-
请为源数据添加源数据和想要的结果。
-
任何有索引的都是有效的源数据。问题在于索引值的累加器,而不是数据。我将添加调用该方法的测试,但我认为这没有多大帮助。
-
您似乎为此付出了很多努力,但是
Select的过载也占用了索引:msdn.microsoft.com/en-us/library/bb534869(v=vs.110).aspx 我认为这已经实现了您想要的 -
如我上面引用的链接中所述。
标签: c# linq functional-programming