如何在条件的一列中使用LINQ select

时间:2016-01-25 09:19:08

标签: c# linq select

这样的数据表......

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?
非常感谢

4 个答案:

答案 0 :(得分: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;
    }
}

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

虽然其他答案中描述的索引技术将起作用,但如果源序列不是基于列表的话,它们将是低效的,在这种情况下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);