2010-09-21 39 views
0

的陣列我有這樣的事情:使用LINQ總結返回值

long[] f = new long[4]{1,10,100,1000}; 

我要除以100 1000,100 10和10由1

有沒有辦法返回結果與結果的陣列例如/ 10,10,10

UPDATE:這似乎混淆幾個所以這裏是另一個例子

長[] F =新長[ 3] {1,2,6};

我想用2和2 1在一個陣列的結果分爲6

+0

問題的發言不明確我。你想把每個元素分成相應的十個冪數嗎? (10^i)中。除以前的元素?在這種情況下,你想在零分區情況下發生什麼? – 2010-09-21 08:52:31

回答

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 :)

+1

雖然這個實現將起作用,但它要求輸入是直接可訪問的。通用的「IEnumerable」解決方案是首選。 – xtofl 2010-09-21 09:44:56

+0

那麼我的解決方案解決了這個問題,它非常緊湊。我不明白爲什麼有人會減去一個可行的解決方案 - 這很荒謬。任何人如果知道的話可以提供更好的選擇。 – testalino 2010-09-21 10:03:26

+0

@xtofl:參數類型可以更改爲ReadOnlyCollection 。但是testalino的解決方案仍然是文件。 – Liton 2010-09-22 07:38:27

4

我不認爲總在這種情況下,會幫...郵編會更適合:

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); 
      } 
     } 
    } 
+0

我只有.Net 3.5 – Jon 2010-09-21 09:05:30

+0

查看我的更新回答 – 2010-09-21 09:22:27

3

如果我理解正確的話,你可能不希望在這裏使用聚合而是Pairwise

long[] result = f.Pairwise((x, y) => y/x).ToArray(); 

下面是一個例子實現成對的:

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