使用Linq Aggregate返回值数组

时间:2010-09-21 08:46:41

标签: c# .net linq .net-3.5 c#-3.0

我有这样的事情:

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,结果为数组

3 个答案:

答案 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);
    }
}

Source

如果您想以相反的顺序搜索结果,请添加对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中运行:)