2014-12-31 14 views
8

Có một số List<int> chứa một số số. Ngẫu nhiên tôi chọn một chỉ mục, sẽ được xử lý riêng biệt (gọi là chính). Bây giờ, tôi muốn loại trừ chỉ mục cụ thể này và nhận tất cả các phần tử khác của List (gọi cho chúng là slave).Loại trừ một mục khỏi danh sách (theo Chỉ mục) và chụp tất cả các mục khác

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 */ 

Join, Select, Except - ai trong số họ, và làm thế nào?

EDIT: Không thể xóa bất kỳ mục nào khỏi danh sách gốc, nếu không tôi phải giữ hai danh sách.

Trả lời

16

Sử dụng Where: -

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

Working Fiddle.

+0

Đáng yêu! Nó hoạt động hoàn hảo. Hình thức này của 'Where' không rõ ràng ở bất cứ đâu trong tài liệu. – Ajay

+0

@Ajay - Tài liệu ở đó, kiểm tra liên kết tôi đã chia sẻ cho 'Where', quá tải thứ hai của nó ở đâu. –

+2

Vâng. Bởi thời gian này, tôi đã sử dụng cách tiếp cận này trong mã sản phẩm thực tế (không rõ ràng là danh sách các int). – Ajay

2

Bạn có thể loại bỏ mục Thạc sĩ từ danh sách,

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

RemoveAt() xóa item khỏi danh sách ban đầu, Vì vậy, nó không phải là cần thiết để gán bộ sưu tập vào một danh sách mới. Sau khi gọi RemoveAt(), items.Contains(MasterItem) sẽ trả lại false.

+0

Yêu cầu hai danh sách. Tôi cần giữ bản gốc! – Ajay

+1

@Ajay RemoveAt() xóa mục khỏi danh sách gốc, Vì vậy, không cần phải gán nó vào danh sách mới. Sau khi gọi RemoveAt() "items" sẽ không có mục chính trong đó. – Kurubaran

+1

Vì vậy, bạn muốn tôi nên đọc từ DB, mạng, tập tin một lần nữa? Điều đó không thích hợp. – Ajay

2

Nếu hiệu suất là vấn đề bạn có thể thích sử dụng phương thức List.CopyTo như thế này.

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); 
} 

thực hiện này là nhanh hơn so với @RahulSingh câu trả lời gần 3 lần.

Các vấn đề liên quan