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 からのものであるため、ハードコードされておらず、値がここにあるものと異なる場合があります。 . 1つのステートメントでLINQを使用するための最良の方法は何ですか.

4

4 に答える 4

0

これはどう ?

    var qPeriods = periods.Where(v => v <= overDueDays)
                          .Select((result, i) => new { index = i })
                          .Last();
于 2012-07-09T13:02:13.620 に答える
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

それがソートされていると仮定すると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!");
}

範囲の上限値と比較することに関心があるため、最初の値はスキップされます。それをスキップすることで、インデックスは 1 を引く必要なく所定の位置に収まりFirstOrDefaultますoverDueDays

于 2012-07-09T13:17:28.793 に答える