web-dev-qa-db-ja.com

リストから1つのアイテムを(インデックスで)除外し、他のすべてのアイテムを取得します

いくつかの数字のセットを含むList<int>があります。ランダムにインデックスを選択します。これは個別に処理されます(masterと呼びます)。ここで、この特定のインデックスを除外し、Listの他のすべての要素を取得します(それらをslaveと呼びます)。

var items = new List<int> { 55, 66, 77, 88, 99 };
int MasterIndex = new Random().Next(0, items .Count);

var master = items.Skip(MasterIndex).First();

// How to get the other items into another List<int> now? 
/*  -- items.Join;
    -- items.Select;
    -- items.Except */

JoinSelectExcept-それらのいずれか、そしてどのように?

EDIT:元のリストからアイテムを削除することはできません。そうしないと、2つのリストを保持する必要があります。

14
Ajay

使用 場所 :-

var result = numbers.Where((v, i) => i != MasterIndex).ToList();

動作中 フィドル

26
Rahul Singh

リストからマスターアイテムを削除できます。

_List<int> newList = items.RemoveAt(MasterIndex);
_

RemoveAt() は元のリストからアイテムを削除するため、コレクションを新しいリストに割り当てる必要はありません。 RemoveAt()を呼び出した後、items.Contains(MasterItem)falseを返します。

3
Kurubaran

パフォーマンスが問題になる場合は、このような List.CopyTo メソッドを使用することをお勧めします。

List<T> RemoveOneItem1<T>(List<T> list, int index)
{
    var listCount = list.Count;

    // Create an array to store the data.
    var result = new T[listCount - 1];

    // Copy element before the index.
    list.CopyTo(0, result, 0, index);

    // Copy element after the index.
    list.CopyTo(index + 1, result, index, listCount - 1 - index);

    return new List<T>(result);
}

この実装は、@ RahulSinghの回答よりもほぼ3倍高速です。

3
Orace