2016-04-15 11 views
0

LINQを経由してこれを行うための効率的な方法があるかどうか私が探しています:LINQ最初に出現したに等しい距離の前と後の目標値を見つける

私は、例えば、値のリストを持っています{98、98.5、99、99.5、100、101、102}

Iは、基準値を供給し、その離れ等しい距離にある前後に最も近い値を探したいです。

例1)基準値が99である - > Iは、98.5及び99.5

例2を見つけたい)基準値は100 - > Iが99と101(音符を見つけたい、それが99.5をスキップしています)

離れ基準値から等距離のない2つの値が存在しない場合、それは返す必要がありますヌルあなたは私たちが表示されるはずです

+2

あなたは試してみた何...コードは、束が – mindandmedia

+0

これを軌道に乗るだろうあなたの仕様はあまり明確ではありません。例えば、 '99'の入力はなぜ' 98,100'ではなく '98.5,99.5'を返しますか? – ryanyuyu

+0

は、距離が等間隔である基準値に可能な値を「最も近い」ものとする。私は質問に「最も近い」を追加します – TJF

答えて

4
var items = new[] {98, 98.5, 99, 99.5, 100, 101, 102}; 
var target = 99; 

var result = items.Distinct() // Omit duplicates. 
        .Select(Value => new {Value, Distance = Math.Abs(target - Value)}) // pair the Value with the distance. 
        .GroupBy(x => x.Distance) // Group the values by distance. 
        .Where(x => x.Count() > 1) // Omit the values where there is no symmetrical distance. 
        .OrderBy(x => x.Key) // Order them by distance. 
        .FirstOrDefault(); // Take the first one. 

if (result != null) 
    foreach (var item in result) 
     Console.WriteLine(item.Value); 
+0

良い点。更新しました。 –

関連する問題