LINQでList<int>
から最も近い番号を取得する方法は?
例えば:
List<int> numbers = new List<int>();
numbers.Add(2);
numbers.Add(5);
numbers.Add(7);
numbers.Add(10)
リストで番号9に最も近い値を見つける必要があります。この場合は10。
LINQでこれを行うにはどうすればよいですか?
LINQ to Objects を使用し、リストが長い場合、次を使用します。
_List<int> list = new List<int> { 2, 5, 7, 10 };
int number = 9;
int closest = list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) ? x : y);
_
この方法は、Anthony Pegramが提案したソリューションよりもやや複雑ですが、リストを最初にソートする必要がないという利点があります。これは、O(n)
の代わりにO(n*log(n))
の時間の複雑さとO(1)
の代わりにO(n)
のメモリ使用量があることを意味します。
LINQを使用してこのタスクを実行する場合は、次のように実行できます。
List<int> list = new List<int> { 2, 5, 7, 10 };
int number = 9;
// find closest to number
int closest = list.OrderBy(item => Math.Abs(number - item)).First();
上記のソリューションはすべてO(N)
です。
大きなリストがあり、この最も近い要素のクエリを複数回実行する場合、最初にリストをソートして(O(NlogN)
)、各クエリにList<T>.BinarySearch
を使用する方がパフォーマンスが向上します。 k
クエリのパフォーマンスは、前のメソッドのO( (k+N)logN )
と比較してO(kN)
です。
あなたはバイナリ検索をすることができます。最も近い番号を検索するのに役立つのは、c#の組み込みメソッドです。ここに例: https://msdn.Microsoft.com/en-us/library/y15ef976(v = vs.110).aspx