次のように作成されたリンクリストがあります。
LinkedList<int> linked = new LinkedList<int>();
var array = new int[] { 23, 55, 64, 65 };
foreach (var item in array)
{
linked.AddLast(item);
}
数字の 64 のインデックスを見つけるにはどうすればよいですか?
唯一の方法は、要素ごとにチェックし、カウンターを増やすことです (「唯一の方法」で、LINQ のような他の方法は内部で同じことを行う必要があると言っています)。
手書きの拡張メソッドは次のようになります。
public static class LinkedListExt
{
public static int IndexOf<T>(this LinkedList<T> list, T item)
{
var count = 0;
for (var node = list.First; node != null; node = node.Next, count++)
{
if (item.Equals(node.Value))
return count;
}
return -1;
}
}
ただし、 @LB が書いたように LINQ を使用して簡単に実行できます(同じ時間の複雑さをもたらします)。
匿名オブジェクトの作成を回避し、アイテムがリストにない場合は-1を返す代替のLINQ実装を次に示します。
int index = linked.Select((n, i) => n == 64 ? (int?)i : null).
FirstOrDefault(n => n != null) ?? -1;
数字のシーケンスを、一致のインデックスなどを含むシーケンスに変換しnull
ます。int?
これらの最初のものがある場合はそれを取り、そうでない場合はデフォルトをに変換します-1
。
編集:
これがより良い(よりシンプルでよりパフォーマンスの高い)代替案です:
int i = linked.TakeWhile(n => n != 64).Count();
i
インデックスに等しいlinked.Count
か、値64
が見つからなかった場合はに等しくなります。
int index = linked.Select((item, inx) => new { item, inx })
.First(x=> x.item == 64).inx;
リストを解析してチェックする独自の関数を作成する必要があると思います。「検索」機能は最初の出現のみを返します。リストに 64 が 2 つ以上出現する可能性があります。