2016-01-25 68 views
1
這樣

數據表一個欄選擇...如何使用LINQ與條件

Date  Count 
20160101 100 
20160102 103 
20160103 108 
20160104 102 
20160105 104 
20160106 106 
20160107 108 

我想下面select if => someday.Count > someday[-3].Count

結果= 3Rows:

20160104,因爲102> 100
20160105,因爲104> 103
20160107,因爲108> 102

請告訴我如何使用LINQ?
非常感謝

+0

你能澄清你的問題,還是使用不同的措辭?理解你想要的東西非常困難。 –

回答

1

一種方式是通過做這樣的。

int index = 0; 
var a = from i in someday 
     let indexNow = index++ 
     where indexNow >= 3 
     let j = someday[indexNow - 3] 
     where i.Count > j.Count 
     select i; 

您可以創建臨時變量j以獲取元素之前的三個步驟,然後將其與當前元素進行比較以檢查它是否滿足特定條件。如果是,那麼你選擇它

1

您可以使用Where超載,其中Func<TSource, int, bool> predicate作爲輸入。這個委託的第二個輸入是當前元素的索引。所以,這意味着你的lambda表達式必須有兩個輸入,其中第一個將是你的元素的類型,其他的將是Int32Where方法會自動計算當前元素的索引。

var result = myColl.Where((x, index) => index >= 3 && x.Count > myColl.ElementAt(index - 3).Count); 

然後你可以使用你想要的方法Select()ToList()

P.S:我假定對象的名稱是myColl

此外:

我總是喜歡告訴http://referencesource.microsoft.com/開發商。您可以輕鬆找到所有關於C#源代碼的方法和一切的實現。 如果你感興趣的話,這裏是Where方法的超載源代碼。

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate) { 
     if (source == null) throw Error.ArgumentNull("source"); 
     if (predicate == null) throw Error.ArgumentNull("predicate"); 
     return WhereIterator<TSource>(source, predicate); 
    } 

正如你看到的,它將返回WhereIterator,它會自動計算出當前項目的索引,並將其發送給你的方法:

static IEnumerable<TSource> WhereIterator<TSource>(IEnumerable<TSource> source, Func<TSource, int, bool> predicate) { 
    int index = -1; 
    foreach (TSource element in source) { 
     checked { index++; } 
     if (predicate(element, index)) yield return element; 
    } 
} 
+0

非常感謝,我會研究你的建議 – DavidLu

1

使用索引Where - 過載如下:

var result = myDates.Where((x, index) => index >= 3 && x > myDates.ElementAt(x - 3).Count); 

這將選擇所有從您的收藏具有腋臭這種情況一方面源自元素從三天較大數量的那些元素之前。

1

雖然在其他的答案中描述的索引技術將工作,它們將是低效的,如果源序列不是基於列表的,在這種情況下ElementAt將導致O(N^2)時間複雜度的操作。

只有O(n)的時間複雜度可能更好的方式(如果源序列本身不包含重操作)是使用SkipZip組合,這樣

var result = myDates 
    .Skip(3) 
    .Zip(myDates, (current, compare) => current.Count > compare.Count ? current : null) 
    .Where(item => item != null);