0

我有一个收藏

List<int> periods = new List<int>();
            periods.Add(0);
            periods.Add(30);
            periods.Add(60);
            periods.Add(90);
            periods.Add(120);
            periods.Add(180);

            var overDueDays = 31;

我在到期日有一个变量。当值在 0 到 29 之间时,我想返回 0 的索引。当在 30 到 59 之间时,我想返回索引 1。期间列表来自 db,因此它不是硬编码的,值可能与这里的不同. 在一个语句中使用 LINQ 的最佳方法是什么。

4

4 回答 4

0

您可以使用.TakeWhile()

int periodIndex = periods.TakeWhile(p => p <= overDueDays).Count() - 1;
于 2012-07-09T11:46:40.330 回答
0

这并不是 Linq 的真正设计目的,但是(假设范围不固定)您可以执行以下操作来获取索引

List<int> periods = new List<int>();
            periods.Add(0);
            periods.Add(30);
            periods.Add(60);
            periods.Add(90);
            periods.Add(120);
            periods.Add(180);

var overDueDays = 31;

var result = periods.IndexOf(periods.First(n => overDueDays < n)) - 1;
于 2012-07-09T11:29:33.930 回答
0

这个怎么样 ?

    var qPeriods = periods.Where(v => v <= overDueDays)
                          .Select((result, i) => new { index = i })
                          .Last();
于 2012-07-09T13:02:13.620 回答
0

假设periods已排序,您可以使用以下方法:

var result = periods.Skip(1)
                    .Select((o, i) => new { Index = i, Value = o })
                    .FirstOrDefault(o => overDueDays < o.Value);

if (result != null)
{
    Console.WriteLine(result.Index);
}
else
{
    Console.WriteLine("Matching range not found!");
}

第一个值被跳过,因为我们有兴趣与范围的上限值进行比较。通过跳过它,索引会在不需要减去 1FirstOrDefault的情况下就位。在overDueDays不落在任何可用范围之间的情况下使用。

于 2012-07-09T13:17:28.793 回答