这样的数据表......
await
我想要Date Count
20160101 100
20160102 103
20160103 108
20160104 102
20160105 104
20160106 106
20160107 108
结果= 3行以下:
20160104,因为102> 100
20160105,因为104> 103
20160107,因为108> 102
请告诉我如何使用LINQ?
非常感谢
答案 0 :(得分:1)
您可以使用Where
重载,以Func<TSource, int, bool> predicate
作为输入。该委托的第二个输入是当前元素的索引。所以,这意味着你的lambda表达式必须带两个输入,第一个输入将是你元素的类型,其他输入将是Int32
。
Where
方法将自动计算当前元素的索引。
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;
}
}
答案 1 :(得分: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以获取元素前三步,然后将其与当前元素进行比较以检查它是否满足特定条件。如果是,则选择它
答案 2 :(得分:1)
使用索引Where
- 重载,如下所示:
var result = myDates.Where((x, index) => index >= 3 && x > myDates.ElementAt(x - 3).Count);
这将从您的收藏集中选择所有这些元素,这些元素在三天前的元素中具有更大的数量。
答案 3 :(得分:1)