私は5つのアイテムのリストを持っています。
次のような最後のアイテムを抽出したい:
string lastItem = myList.Last();
ただし、この後、myList には 4 つの項目が含まれている必要があります。抽出された最後の項目を除くすべてです。
出来ますか?または、.Take(4) を使用する必要がありますか?
最後に撮りたい場合は、次のようにすることができます。
string lastItem = myList.Last();
myList.Remove(myList.Last());
//myList.Count() will now be 4.
フェッチ/削除を行うために任意のインデックスを使用する拡張メソッドを作成できます。
public static T Extract<T>(this List<T> list, int index)
{
var item = list[index];
list.RemoveAt(index);
return item;
}
最後のアイテムは常にを使用して見つけることができるCount - 1
ので、呼び出しは単純です:
var item = list.Extract(list.Count - 1);
これは、インデックスによって任意のアイテムを「抽出」できることを意味します。
またはメソッドを使用して、リストから要素を削除できList.Remove
ます。List.RemoveRange
List.RemoveAt
使用するリスト インデクサーを使用してリストへの参照を取得した後、リストの最後の要素を削除するには、次のようにします。
var element = myList[myList.Count - 1];
myList.RemoveAt(myList.Count - 1);
削除するアイテムのインデックスを最初に見つける必要がなく、削除するアイテムに一致する最初のオカレンスを削除するだけであることに注意する必要がないためRemoveAt
、代わりに使用するRemove
とより効率的です。Remove
最後の要素。
最後に、リストの最後の項目を数回削除するアルゴリズムがある場合は、たとえばQueue
.
これを行うための拡張メソッドを作成します
public static class Extension
{
public static string RemoveLast(this IList<string> myList)
{
int lastItemIndex = myList.Count - 1;
string lastItem = myList.Last();
myList.RemoveAt(lastItemIndex);
return lastItem;
}
}
それを次のように呼びます
string itemRemoved = lst.RemoveLast(); //this will delete the last element from list & return last element as well
リストの代わりにスタックを使用しない方が適切だと思われる理由
[Test]
public void MyTest()
{
Stack<int> stack = new Stack<int>(new[] { 1, 2, 3, 4, 5 });
int pop = stack.Pop();
Assert.AreEqual(stack.Count, 4);
Assert.AreEqual(pop, 5);
}