web-dev-qa-db-ja.com

LINQを使用してList <int>から最も近い番号を取得する方法は?

LINQでList<int>から最も近い番号を取得する方法は?

例えば:

List<int> numbers = new List<int>();
numbers.Add(2);
numbers.Add(5);
numbers.Add(7);
numbers.Add(10)

リストで番号9に最も近い値を見つける必要があります。この場合は10。

LINQでこれを行うにはどうすればよいですか?

56
ale

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)のメモリ使用量があることを意味します。

120
Elian Ebbing

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();
34
Anthony Pegram

上記のソリューションはすべてO(N)です。

大きなリストがあり、この最も近い要素のクエリを複数回実行する場合、最初にリストをソートして(O(NlogN))、各クエリにList<T>.BinarySearchを使用する方がパフォーマンスが向上します。 kクエリのパフォーマンスは、前のメソッドのO( (k+N)logN )と比較してO(kN)です。

4

あなたはバイナリ検索をすることができます。最も近い番号を検索するのに役立つのは、c#の組み込みメソッドです。ここに例: https://msdn.Microsoft.com/en-us/library/y15ef976(v = vs.110).aspx

0
A. Randhawa