2009-05-11 1 views
3

엽기적으로 스택 컬렉션이 오히려 기본 Shift 및 Unshift 메소드 *를 빠뜨린 것 같습니다. 2.0에서 작업 중이므로 확장 할 수 없습니다.C# 2.0에서 스택 컬렉션 누락과 쉬프트가 누락되었습니다.

이러한 방법을 사용할 수있는 합리적인 기술이나 대체 수집 클래스가 있습니까? 나는 밀고 팝해야한다.

편집 : 내가 원하는 컬렉션처럼 보인다는 참으로 행복 하 게 네이티브가 아닌 deque입니다 C# :(

나는 어설픈 LinkedList의와 함께 갈 것 때문에이 시간에 타사 라이브러리를 사용할 수 없습니다 (이 작업을하는 읽기 및 제거하기 때문에 변화가 하나가 될 것입니다 어디 투박한 말)하지만 난 확장 메서드로 업그레이드, 더 나은 아직. 또는를 사용할 수있는 사람에 PowerCollections 접근 방식을 권하고 싶습니다 생각합니다.

한숨


* 사과, 나는 이것들이 흔하지 않은 용어라는 것을 깨닫지 못했고, API에서 그것들을 어디에서 찾을 수 있을지 모른다고 생각했습니다. 참고 :

시프트 = 스택 취소] 시프트 듣지 않고 컬렉션

+0

내 블로그에 _immable deque_의 C# 구현을 게시했습니다. 당신이 원하는대로 자유롭게 사용할 수 있습니다. 코드가 테스트되지 않았습니다! 구매자가주의해야합니다. http://blogs.msdn.com/ericlippert/archive/2008/02/12/immutability-in-c-part-eleven-a-working-double-ended-queue.aspx –

답변

14

나는 LinkedList<T>이라고 말하고 싶습니다. 앞에 추가하거나 제거하는 방법과 뒤에서 추가하거나 제거하는 방법이 있습니다. 나는 변화와 변화를 들어 본 적이 없지만 그것이 그것이 의미하는 바라고 추측하고있다.

+0

내 생각이기도합니다. –

+0

감사합니다. 고마워. 닷넷 프레임 워크 : D !! 다른 많은 언어와 비교하여 C#으로 작업하는 것이 얼마나 쉬운가. – Samuel

9

/초에서의 첫번째 요소를

취소] = 인서트 요소를 제거한다. Stack 클래스는 Pop, PeekPush을 제공합니다.

+2

javascript 그리고 perl은 최소한 shift/unshift를가집니다. push/pop과 논리적으로 반대입니다. – annakata

+3

그러나 전통적인 '스택'데이터 구조의 일부는 아닙니다. –

+0

@Annakata : Perl과 JavaScript는 배열을 대기열, 스택 및 대기열에서 제외 할 수 있도록 배열이 아닌 배열에 해당 메소드를 배치합니다. .NET은 형식 시스템에서 좀 더 구체적입니다 (정적 형식의 afterall입니다). – Richard

1

C# 3.0 타겟팅 2.0을 사용하는 한 fake extension methods이 될 수 있습니다.

교대/비 이동 작업을 설명 할 수 있습니까?

+0

VS2k8이 없기 때문에 어쨌든 2.0으로 컴파일해야하지만 유익하지만 그럼에도 불구하고 – annakata

1

정의 스택 클래스는 요소를 추가하고 제거하기 위해 LIFO (Last In First Out) 기법을 사용하여 컬렉션의 요소를 관리하는 방법을 나타냅니다. LIFO는 단순히 컬렉션에 추가 된 마지막 요소가 자동으로 제거 된 첫 번째 요소라는 것을 의미합니다.

당신이 그것에서 원하는 기능은 무엇인가 정의하지만, 쉽게 길을

public class MyStack<T>:Stack<T>{ 
    public void Shift(T item){ 
    // load stack into internal ordered list 
    // clear stack content 
    // insert into internal list at desired location 
    // populate stack with content from internal list 
    } 
    public void Unshift(T item){ 
    // load stack into internal ordered list 
    // clear stack content 
    // insert into internal list at desired location 
    // populate stack with content from internal list 
    } 
} 

다음의 달성 될 수 있고 보인다이 그것을-의 당신은 당신이 경우 잘못된 클래스를 사용하는 모든 :)

+0

그것이 어떻게 도움이 될지 모르겠습니다. 스택에 아무것도 (Nothing in ) 기본 배열에 대한 액세스 권한을 부여하여 해당 작업을 수행하지 않습니다. –

+1

내가 말하는 것은 기본 데이터에 액세스 할 수 없기 때문에 O (1) 작업을 O (n)으로 돌리고 있다는 것입니다. 이것은 매우 비효율적 인 방법입니다. 그렇죠? –

+0

수 있습니다,하지만 난 그들과 함께 (콘텐츠 개체) 오직 참조 순서를 변경 고통스럽게 보지 못 하겠어요. 이 기능이 "반드시 있어야"하는 경우에는 성능에 대해주의 깊게 테스트해야합니다. 다시 ... 그냥 주문하고 팝을하고 심지어 – ruslander

6

쉬프트/언 쉬프트 방식이 필요합니다. stack은 LIFO (Last-In-First-Out) 데이터 구조입니다.

팝업 및 푸시없이 이동/이동 취소를 원하면 Queue을 사용하십시오. 당신이 모두를 원하는 경우에, 나는 스택의 요소 수를 반환하지 않는 PowerCollections 라이브러리

+0

후에 슬쩍 할 수는 없지만 "deque"라는 단어는 나에게 대답을 주었다. – annakata

0
Shift ==> Stack.Pop 
Unshift ==> Stack.Push 

Unshift에서 Deque를 사용하는 것이 좋습니다, 당신은에 대한 Stack.Count 속성이 있습니다.

또한 제거하지 않고 첫 번째 요소를 가져 오려면 Stack.Peek이 있습니다.

Stack<T> class

+0

shift/unshift! = push/pop - 전자는 처음과 후반에 작동한다. 컬렉션의 끝에. 전혀 다른. – annakata

+0

Stack은 LIFO이므로 push와 pop은 모두 Collection의 상단에서 작동합니다. Javascript에서 shift와 unshift는 둘 다 배열의 시작으로 작동합니다. http://www.exforsys.com/tutorials/javascript/javascript-array-object-methods-part-2/1.html – DonkeyMaster

1

이 정확히 최고 아니지만, 변화/취소] 및 푸시/팝과 자바 스크립트 배열되는 가까이 온다. 그것은 내부 동작을 숨기지 않으며 원하는 모든 항목의 색인을 생성 할 수 있습니다. 나는 기본적인 기능을 가지고있다.

public class JSList<T> : List<T> 
{ 
    public JSList() : base() {} 

    /// <summary> 
    /// this the add item to the start of the list 
    /// </summary> 
    /// <param name="v"></param> 
    public void Shift(T v) 
    { 
     this.Insert(0, v); 
    } 

    /// <summary> 
    /// remove item at the start of the list 
    /// </summary> 
    /// <returns></returns> 
    public T Unshift() 
    { 
     var toreturn = default(T); 
     if (this.Count > 0) 
     { 
      toreturn = this[0]; 
      this.RemoveAt(0); 
     } 
     return toreturn; 
    } 

    /// <summary> 
    /// Adds object to end of the list 
    /// </summary> 
    /// <param name="v"></param> 
    public void Push(T v) 
    { 
     this.Add(v); 
    } 

    /// <summary> 
    /// removes an item at the end of the list 
    /// </summary> 
    /// <returns></returns> 
    public T Pop() 
    { 
     var toreturn = default(T); 
     if (this.Count > 0) 
     { 
      toreturn = this[this.Count - 1]; 
      this.RemoveAt(this.Count - 1); 
     } 
     return toreturn; 
    } 

    public T Peek() 
    { 
     return this[this.Count - 1]; 
    } 
}