我有这样的事情:
long[] f = new long[4]{1,10,100,1000};
我想将1000除以100,100乘10和10乘1
有没有办法在数组中返回结果,例如/ 10,10,10
更新:这似乎让一些人感到困惑,所以这是另一个例子
long [] f = new long [3] {1,2,6};
我想将6除以2和2除以1,结果为数组
答案 0 :(得分:4)
在这种情况下,我不认为聚合会有所帮助...... Zip会更适合:
long[] f = new long[4]{1,10,100,1000};
long[] result = f.Skip(1).Zip(f, (a, b) => a / b);
编辑:如果您使用的是.NET 3.5,您可以自己轻松编写Zip
扩展方法:
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> selector)
{
if (first == null)
throw new ArgumentNullException("first");
if (second == null)
throw new ArgumentNullException("second");
if (selector == null)
throw new ArgumentNullException("selector");
return first.ZipIterator(second, selector);
}
private static IEnumerable<TResult> ZipIterator<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> selector)
{
using (var enum1 = first.GetEnumerator())
using (var enum2 = second.GetEnumerator())
{
while (enum1.MoveNext() && enum2.MoveNext())
{
yield return selector(enum1.Current, enum2.Current);
}
}
}
答案 1 :(得分:3)
如果我理解正确,你可能不想在这里使用聚合,而是Pairwise:
long[] result = f.Pairwise((x, y) => y / x).ToArray();
以下是Pairwise的示例实现:
public static IEnumerable<TResult> Pairwise<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TSource, TResult> resultSelector)
{
TSource previous = default(TSource);
using (var it = source.GetEnumerator())
{
if (it.MoveNext())
previous = it.Current;
while (it.MoveNext())
yield return resultSelector(previous, previous = it.Current);
}
}
如果您想以相反的顺序搜索结果,请添加对Reverse
的调用。
答案 2 :(得分:0)
不使用Linq的简单解决方案:
IEnumerable<long> GetResults(long[] input)
{
for (int i = input.Length -1; i >= 1; --i)
yield return input[i] / input[i - 1];
}
你可以在返回值上使用Linq,它可以在.NET 3.5中运行:)