0

数値の配列のリストがあります。検索番号がインデックス 0 に位置する数値の間にある 2 つの配列を検索しています。次に、2 番目の配列からインデックス 1 に位置する数値を返します。(インデックス 0 の数字は既にソートされており、重複はないと仮定します)

LINQPad の私の間違った解決策:

2 番目と 3 番目の配列で 9 が 4 と 10 の間にあるため、「found」の値は 3 である必要があります。次に、2 番目に見つかった配列を取得し、その配列のインデックス 1 にある 3 を返します。

List<int[]> list = new List<int[]> { new[] { 1, 5 }, new[] { 4, 6 }, new[] { 10, 3} , new[] { 15, 8} };
int searchFor = 9;
int found = list.Where(n => searchFor >= n[0] && searchFor <= n[0]).Select(i => i[1]).FirstOrDefault();
found.Dump(); //should be 3 instead of 0.
4

4 に答える 4

1

どうですか

        var found = list.First(l => l[0] > searchFor)[1];

list最初の要素ごとに順序付けられていると想定できるので、うまくいくはずです。

そうでない場合は、

        var found = list.Orderby(l=>l[0]).First(l => l[0] > searchFor)[1];

も動作するはずです。

于 2013-10-03T13:09:18.453 に答える
1

私の論理は少し異なりますが、必要な結果が得られます。このようなキーペア値を行う場合は、辞書を使用することをお勧めします。私の意見では、それは物事をより簡単にし、繰り返しキーがない場合、これはうまくいくはずです。

 // Use dictionary instead of array's if just using two int values
 var dic = new Dictionary<int, int>();
 dic.Add(1, 5);
 dic.Add(4, 6);
 dic.Add(10, 3);
 dic.Add(15, 8);

 int searchFor = 9;

 // Don't need to find this really
 int low = (from l in dic
           where l.Key <= searchFor
           select l.Key).Max();

 // Just need this       
 int found = (from h in dic
             where h.Key >= searchFor
             select h.Value).Min();


 Console.WriteLine("Low: " + low);
 Console.WriteLine("Found: " + found);
于 2013-10-03T04:18:17.957 に答える
1

これを試して :

int found = list.Zip(list.Skip(1), (x, y) => x[0]<=searchFor&&y[0]>=searchFor?y[1]:0).FirstOrDefault(o=>o!=0);
于 2013-10-03T04:00:46.573 に答える
0

where ステートメントの式は、最初の要素が 9以下および 9 以上である配列をフィルター処理します。同時にそれ以下大きいことはできないため、実際には、最初の要素が 9 であるすべての配列をフィルター処理します。指定されたデータの場合、これは空のシーケンスになります。したがって、FirstOrDefault はデフォルト (整数の場合は 0) を返します。

実際には、9 以上の最初の要素を探す必要があります。

int[] result = list.FirstOrDefault(arr => arr[0] >= searchFor);

if (result == null)
{
    Console.WriteLine("Not found!");
}
else
{
    Console.WriteLine(result[1]);
}
于 2013-10-03T12:50:51.653 に答える