문제

고 말할 수 있습니다 저는 사전에 객체:

Dictionary myDictionary<int, SomeObject> = new Dictionary<string, SomeObject>();

지금 내가 원하는 반복을 통해 사전에 반전 순서입니다.나는 사용할 수 없습니다 간단을 위한 루프를 알 수 없기 때문에 나의 열쇠를 사전에 있습니다.A foreach 은 쉽습니다:

foreach (SomeObject object in myDictionary.Values)
{
    // Do stuff to object
}

하지만 어떻게 수행할 수 있습니이 역에서?

도움이 되었습니까?

해결책

내가 사용하여 다음 코드 예제에서는 만들 대한 사전입니다.액세스할 수 있습니다 그것은 키,하지만 당신은에 액세스할 수 있으로 인덱스뿐만 아니라.

SortedList sCol = new SortedList();

sCol.Add("bee", "Some extended string matching bee");
sCol.Add("ay", "value matching ay");
sCol.Add("cee", "Just a standard cee");

// Go through it backwards.
for (int i = sCol.Count - 1; i >=0 ; i--)
    Console.WriteLine("sCol[" + i.ToString() + "] = " + sCol.GetByIndex(i));

// Reference By Key
foreach (string i in sCol.Keys)
    Console.WriteLine("sCol[" + i + "] = " + sCol[i]);

// Enumerate all values
foreach (string i in sCol.Values)
    Console.WriteLine(i);

는 점은 주목할 만한 가치가 있는 정렬된 목록을 저장한 키/값 쌍으로 분류 열쇠니다.

다른 팁

사전 또는 그 밖의 형태의 해시 테이블이 없습니다.그래서 당신은 무엇을 하려고 하는 것은 무의미:)

이 있는 경우.NET3.5 사용할 수 있습니다.역()장 방법에 IEnumerables.예를 들어:

foeach (SomeObject o in myDictionary.Values.Reverse())
{
     // Do stuff to object
}

실제로,C#2.0 당신은 당신의 자신을 만들 수 있습니다 반복을 통과하는 컨테이너에 역행합니다.다음을 사용할 수 있습니다 반복기에서 당신의 foreach 문입니다.하지만 반복하는 방법 탐색의 용기에서 첫 번째 장소입니다.는 경우에 그것은 단순한 배열을,그 뒤로 이동 다음과 같다:

static IEnumerable<T> CreateReverseIterator<T>(IList<T> list)
{
    int count = list.Count;
    for (int i = count - 1; i >= 0; --i)
    {
        yield return list[i];
    }
}

하지만 물론 당신은 할 수 없는 사전에 그대로 구현하지 않는 명령하거나 제공하는 인덱서입니다.말는 사전에 있지 않은 주문은 진실하지 않다:물론 그것이 순서입니다.는 주문할 수도 있습 유용한 알고 있는 경우입니다.

에 대한 당신의 문제에 대한 해결책:는 말을 사본 요소를 배열을 사용하고,위의 방법을 통과하는 그것에 반대입니다.다음과 같다:

static void Main(string[] args)
{
    Dictionary<int, string> dict = new Dictionary<int, string>();

    dict[1] = "value1";
    dict[2] = "value2";
    dict[3] = "value3";

    foreach (KeyValuePair<int, string> item in dict)
    {
        Console.WriteLine("Key : {0}, Value: {1}", new object[] { item.Key, item.Value });
    }

    string[] values = new string[dict.Values.Count];
    dict.Values.CopyTo(values, 0);

    foreach (string value in CreateReverseIterator(values))
    {
        Console.WriteLine("Value: {0}", value);
    }

}

로 복사하는 값을 배열이처럼 보일 수 있는 나쁜 생각만의 유형에 따라 값 그것은 정말 나쁜.당신은 그냥 있을 복사한다.

동의함으로@leppie 지만,을 자격이 있다고 생각하시는 질문에 대한 답변 일반적이다.그것은 될 수 있는 의미에 대한 질문에 일반적으로,그러나 실수로 나쁜 데이터 구조입니다.의 값 순서에서 사전 고려되어야 구현-특정;에 따라 문서를 항상 같은 순서로 그는 이 순서가 지정되지 않음 뿐입니다.

어쨌든지 간단한 방법 확인 foreach 에서 작업 역이다.그것은 문법을 사용하여 클래스의 열정과 열거자를 여행할 수 있는 하나의 방향이다.기술적으로 응답할 수 있었다"역 수집,그 열거"하지만,저는 이것을 생각하는 경우 당신은 단지 사용"뒤로"루:

for (int i = myCollection.Length - 1; i >= 0; i--)
{
    // do something
}

이 없는 경우.NET3.5 고,따라서 역 extension 방법을 구현할 수 있습니다.난 그것은 아마 생성하는 중간 목록(필요할 경우)과 반복하며 그것을 역에서식은 다음과 같습니다.

public static IEnumerable<T> Reverse<T>(IEnumerable<T> items)
{
    IList<T> list = items as IList<T>;
    if (list == null) list = new List<T>(items);
    for (int i = list.Count - 1; i >= 0; i-- )
    {
        yield return list[i];
    }
}

는 것입 Dictionary<int, SomeObject> myDictionary, 고,당신이 그것을 할 것으로:

foreach(SomeObject _object in myDictionary.Values.Reverse())
{
}

수있는 가장 쉬운 방법에 함께 올 .NET2.0 첫째로에 복사하는 모든 값을 반대로 나열한 다음 실행 foreach 에는 목록:

Dictionary<int, object> d;
List<object> tmplist;
foreach (object o in d.Values) tmplist.Add(s);
tmplist.Reverse();
foreach (object o in tmplist) {
    //Do stuff
}

면 주문이 가장 중요한,당신은 당신이 스택을 만들고 간단한 구조체를 저장하 int,체 쌍입니다.

을 원하는 경우에는 사전 입력 컬렉션을 하지만 당신을 유지하기 위해 필요 삽입 주문으로 볼 수 있습니다 KeyedCollection

그것은 사이의 합병 사전 목록입니다.는 방법에 액세스할 수 있는 요소에서 컬렉션을 통해 핵심이나 삽입 인덱스입니다.

만 잡았다면 당신의 요소에 저장되는 컬렉션가이 int 키입니다.할 수 있는 경우는 변화는 문자열 또는 다른 유형(Guid mabye 는).이 컬렉션1 을 찾을 것이 핵심이 1 보다는 오히려 인덱스의 1.

는 표준 for 루프는 것이 가장 좋습니다.당신을 걱정할 필요가 없 처리에 대한 오버헤드의 반전의 컬렉션입니다.

사용할 수 있습니다 LINQ to 체 열거.역()함수에서.NET 을 사용하여 2.0 LinqBridge.

리터럴 답변:

Dictionary<int, SomeObject>  myDictionary = new Dictionary<int, SomeObject>();

foreach (var pair in myDictionary.OrderByDescending(i => i.Key))
{
    //Observe pair.Key
    //Do stuff to pair.Value
}
foreach (Sample in Samples)

try the following:

Int32 nEndingSample = Samples.Count - 1;

for (i = nEndingSample; i >= 0; i--)
{
     x = Samples[i].x;
     y = Samples[i].y;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top