2013-06-05 42 views
30

Tôi đang làm việc trên một danh sách động các điểm số được cập nhật thường xuyên. Cuối cùng điều này được sử dụng để tạo ra một đánh giá tổng thể, vì vậy các mục cũ hơn (dựa trên một số tham số, không phải thời gian) cần phải được loại bỏ để ngăn chặn nặng +/- trọng số trên tổng thể. Nó sẽ thêm nhiều giá trị cùng một lúc từ một điều tra riêng.Xóa lần cuối n Mục khỏi Danh sách bằng C#

List<int> scoreList = new List<int>(); 

    foreach(Item x in Items) 
    { 
    scoreList.Add(x.score); 
    } 

    //what I need help with: 
    if(scoreList.Count() > (Items.Count() * 3)) 
    { 
     //I need to remove the last set (first in, first out) of values size 
     //Items.Count() from the list 
    } 

Nếu có ai có thể giúp nó được đánh giá cao :) Tôi phải làm cho mã hơi chung chung vì nó được viết khá khó hiểu (không viết phương pháp).

+3

nếu bạn cần FIFO bạn có thể sử dụng [Queue ] (http://msdn.microsoft.com/en-us/library/7977ey2c.aspx) thay vì Danh sách . –

Trả lời

33

Sử dụng List<T>.RemoveRange - một cái gì đó như thế này:

// number to remove is the difference between the current length 
// and the maximum length you want to allow. 
var count = scoreList.Count - (Items.Count() * 3); 
if (count > 0) { 
    // remove that number of items from the start of the list 
    scoreList.RemoveRange(0, count); 
} 

Bạn loại bỏ ngay từ đầu của danh sách, bởi vì khi bạn Add các mặt hàng họ đi đến cùng - vì vậy lâu đời nhất là lúc bắt đầu.

25

Hãy thử điều này

scoreList.RemoveAt(scoreList.Count-1); 

here là MSDN Điều

+2

Điều đó sẽ xóa mục được thêm gần đây nhất. OP muốn xóa các mục cũ nhất – Blorgbeard

+0

Trong trường hợp của tôi, tôi chỉ cần xóa mục cuối cùng, vì vậy công cụ này hoàn toàn phù hợp với tôi. Cảm ơn. –

1

Tôi không hiểu câu hỏi của bạn rất tốt, hy vọng nếu đây là điều bạn muốn.

scoreList.RemoveRange(Items.Count()*3, scoreList.Count()-Items.Count()*3); 
1

Một cách đơn giản để có được các yếu tố n cuối cùng từ một danh sách với LINQ

 scoreList.Skip(Math.Max(0, scoreList.Count() - N)).Take(N) 
0

tôi đùa giỡn xung quanh và nhìn phương pháp gợi ý ở trên (scoresList.RemoveAt()), nhưng nó đã không phù hợp với tình hình . Gì đã kết thúc làm việc:

if (...) 
{ 
    scoresList.RemoveRange(0, scores.Count); 
} 

Thanks for the guys giúp đỡ

+0

Có vẻ như điều đó sẽ loại bỏ các điểm số được thêm gần đây nhất, không phải điểm số được thêm gần đây nhất? – Blorgbeard

7

Thay vì sử dụng một List<int> tôi sẽ khuyên bạn sử dụng một Queue<int>. Điều đó sẽ cung cấp cho bạn hành vi FIFO mà bạn đang tìm kiếm.

Xem http://msdn.microsoft.com/en-us/library/7977ey2c.aspx để biết thêm thông tin về Hàng đợi.

Queue<int> scoreList = new Queue<int>(); 

    foreach(Item x in Items) 
    { 
    scoreList.Enqueue(x.score); 
    } 

    //Or you can eliminate the foreach by doing the following 
    //Queue<int> scoreList = new Queue<int>(Items.Select(i => i.score).ToList()); 

    //Note that Count is a property for a Queue 
    while (scoreList.Count > (Items.Count() * 3)) 
    { 
    scoreList.Dequeue(); 
    } 
Các vấn đề liên quan