2012-09-06 2 views
3

짧은 역사를 지켜야합니다. 따라서 최대 개수의 항목이있는 목록이 필요합니다. 그리고 나는 그것이 가득 찼을 때조차 새로운 추가를 받아들이 길 원합니다. 이 경우 추가 한 가장 오래된 항목을 잃어 버리게하고 싶습니다. 나는이 목적에 어울리는 수업을 찾지 못했고, 나 자신을했다. 나중에 확실히 메소드를 추가 할 것이지만, 지금은 필요한 것을 가지고 있습니다.제한된 품목 목록

첫 번째 질문은 다음과 같습니다. 올바른 코드입니까? http://pastebin.com/0BCbyNqJ 클래스가 충분히 깨끗해 보이나요?

두 번째 질문은 내가 던지는 예외에 대한 것입니다.

/// <summary> 
/// Oldest item added to the list 
/// </summary> 
public T First 
{ 
    get 
    { 
     if (_head < 0) 
      throw new IndexOutOfRangeException("The list is empty"); 

     if (_firstRoundDone) 
      return _array[(_head + 1) % _max]; 
     else 
      return _array[0]; 
    } 
} 

아무것도 내 목록에 추가하기 전에, 내가 널 돌아 First, LastCount에 전화를하고 싶습니다. 나는 그것이 더 이해 될 것이라고 생각한다. 하지만 반환 형식이 int 또는 T이고, 따라서 나는 where T:Nullable과 같은 제약 조건을 추가하고 싶지 않기 때문에 어떻게해야할지 모르겠다. 아무런 해결책이 없기 때문에 Exception이 가장 좋은 방법이 아닌지 궁금합니다. 아니면 GetFirst(out T first) 또는 심지어 TryGetFirst(out T)과 같은 메소드를 구현해야합니까?

+3

대기열이 더 적합 할 것 같습니까? http://msdn.microsoft.com/en-us/library/7977ey2c.aspx – McGarnagle

+0

당신은 항상 null 대신에'default (T)'를 반환 할 수 있습니다 ... – Spontifixus

+0

@dbaseman 큐는 단지 큐 컬렉션 일 뿐이지 만, LRU 캐시와 같은 제한된 용량을 가짐 – mtijn

답변

8

과 같이 매우 짧은 코드를 생성 할 Queue<> 확장 :

public class Buffer<T> : Queue<T> 
{ 
    private int? maxCapacity { get; set; } 

    public Buffer() { maxCapacity = null; } 
    public Buffer(int capacity) { maxCapacity = capacity; } 

    public void Add(T newElement) 
    { 
     if (this.Count == (maxCapacity ?? -1)) this.Dequeue(); // no limit if maxCapacity = null 
     this.Enqueue(newElement); 
    } 
} 

.Clear().ToList()

이 상속 될 것이다,이를 구현 필요가 없습니다.

+0

내가 너를 바보로 보이게하기 위해 내가 다운 그레이드해야한다. 이 똑똑한 해결책을 가져 주셔서 감사합니다. –

+0

반갑습니다. 'Queue <>'의 thread-safeness를 위해서 스레드 세이프 래퍼를 얻기 위해'Synchronized' 메서드가 제공된다는 점에 유의하십시오. MSDN에는 성장률을 포함한 모든 정보가 들어 있습니다 : http://msdn.microsoft. com/ko-kr/library/system.collections.queue.aspx) – Alex

2

공개적으로 사용 가능한 LRU 캐시 (예 : http://code.google.com/p/csharp-lru-cache/)를 고려하십시오.

+0

고맙습니다. . 하지만 내 현재의 작은 필요에 대한 과잉의 비트입니다. 내가 설명한 것처럼 그것이 예외를 던지더라도 볼 수 있습니다. 매우 흥미로운. –

+0

@ Mr.Pe 타사 코드를 사용하면 응용 프로그램의 다른 부분에 집중할 수 있으며 타사 코드가 이미 해결할 수있는 다른 문제를 만났을 때 확장시 도움이 될 수 있습니다. 그러나 더 많은 것이있을 수 있으며 귀하의 결정입니다. – akton

+0

당신 말이 맞아요. 그러나 예기치 않은 행동을 불러올 수도 있습니다. 이것은 꽤 작은 목적을 위해 여기에 있습니다, 20 개 이상의 항목의 역사. 어느 것이 내가 간결하면서도 일반적인 솔루션을 사용하는 것이 더 좋을 것이라고 생각하게 만듭니다. –

2

내가 틀렸다면 수정하십시오. 그러나 원하는 것은 대기열 인 것처럼 들립니다. 그러나 이것은 is already provided in .Net입니다. 당신은 아마도 그것을 사용하고 그것을 제공하는 방법을 사용해야합니다.

1

나는 오버 플로우를 허용하는 원형 버퍼가 필요하다고 생각한다. 그러한 구현은 found here 일 수 있습니다.

+0

고맙습니다. 아주 좋은 코드입니다. 하지만 내 현재의 작은 필요에 대한 과잉의 비트입니다. 내가 설명한 것처럼 그것이 예외를 던지더라도 볼 수 있습니다. 매우 흥미로운. –

관련 문제