2009-12-04 5 views
1

"사전"데이터베이스가 있고 특정 위치의 요소를 반환하고 싶습니다. "ElementAt"기능이 있지만 사용하지 못했습니다.C#에서 사전의 특정 위치에서 요소를 제거하려면 어떻게해야합니까?

왜 그런 일이 발생하지 않습니까? 그것은 나에게 다음과 같은 오류 알려줍니다

closeHash.ElementAt<State>(i); 

:

오류 3 'System.Collections.Generic.Dictionary' 'ElementAt'최고의 확장 메서드 오버로드 '에 대한 정의를 포함하지 않는 System.Linq.Queryable

if (closeHash.ContainsKey(i) && ((State)closeHash[i]).getH() + 
((State)closeHash[i]).getG() > checkState.getH() + checkState.getG() 
: closeHash [내가] 나에게 인덱스 만이 아닌 실제 요소를 제공하기 때문에 .ElementAt (System.Linq.IQueryable, INT)는 '일부 잘못된 인수

또한이 코드 나던 일을 가지고

사전의 각 요소는 "State"클래스이며 checkState도 GetH 및 GetG 함수가있는 상태입니다. Ith position에서 요소를 꺼내서 제거하고 제거하기 만하면됩니다.

미리 감사드립니다.

그렉

+4

'특정 위치'는 무엇을 의미합니까? 사전은 순서가 없습니다 - 대신 SortedDictionary 또는 SortedList를 사용할 수 있습니까? – thecoop

답변

4

일반 컬렉션에서 사전을 사용하면 절대 RemoveAt()를 사용할 필요가 없습니다. 사전의 키 값은 고유해야합니다.

//  Unique Not Unique 
//   |  | 
Dictionary<int, string> alphabet = new Dictionary<int, string>(); 
alphabet.Add(1, "A"); 
//Adding this will cause an Argument Exception to be thrown 
//The message will be: An item with the same key has already been added. 
alphabet.Add(1, "A"); 

내 알파벳 예에서 키 (24) 항목을 제거하고자한다면, 이것은 내가 필요 것입니다 : 같은 값이 키가 없을 것 때문에

alphabet.Remove(24) 

이 작동 .

이제 키가 있음을 알리지 않고 항목을 제거하려면 다른 이야기입니다. 모든 요소를 ​​살펴보고 연관된 요소를 찾아야합니다. 나는 종류의이 같은 LINQ를 사용합니다 :

var key = (from item in alphabet 
      where item.Value == "K" 
      select item.Key).FirstOrDefault(); 
//Checking to make sure key is not null here 
... 
//Now remove the key 
alphabet.Remove(key) 

두 가지 방법, 이유가 결코, 내가 볼 수있는, 키 값은 고유해야하는 목록에서 RemoveAt을 (인덱스)가 필요 할 수 있습니다.

+0

"키가 null이 아닌지 확인하십시오."다음과 같이 코드가 필요합니다.'int? key = alphabet.Where (item => item.Value == "K") .Select (item => (int?) item.Key) .FirstOrDefault(); if (key.HasValue) {alphabet.Remove (key.Value); } ' –

+0

키에 참조 유형을 사용하는 경우 대답에 설명 된대로 키의 얕은 복사본을 만들어야한다고 생각합니다. 만약 당신이 깊은 복사 객체를 사용한다면,'.Remove'는 작동하지 않을 것이라고 생각합니다. 어쨌든 테스트하지 않았기 때문입니다. –

1

난 당신이 어떻게 든 그것을 할 수 있습니다 확신 해요,하지만 해시 테이블 형식의 컬렉션은 일반적으로 "순서"의 개념에 작동하지 않습니다. Java에서는 Enumerator 또는 Iterator를 가져 와서 건너 뛴 n 번째 항목을 제거 할 수 있지만 다시는 의미가 없다고 생각합니다.

0

ElementAt <> 확장 방법을 사용하려면 System.Linq를 사용해야합니다. 클래스 선언 시작 부분에 다음을 포함 시키십시오.

using System.Linq; 

그리고이 트릭을 수행해야합니다.

1

제거 기능을 사용하고 ElementAt를 전달하는 방법은 어떻습니까?

 Dictionary<int, string> closeHash = new Dictionary<int, string>(); 
     closeHash.Add(47, "Hello"); 
     closeHash.Remove(closeHash.ElementAt(0).Key); 
0

당신의 변수 closeHash는 사전, 분명히 사전 < "내가 타입"입니다라는 오류 메시지가 impleas, 주>. 그렇지 않은 경우 사전의 정확한 선언과 "i"를 지정하십시오.

closeHash [i] 값을 주어야하므로 캐스팅 할 필요가 없습니다.

다른 사람들도 말했듯이 사전에는 "순서"개념이 없으므로 "n 번째 항목"이 아닙니다.

관련 문제