2013-12-13 5 views
0

목록에서 채울 목록 상자가 있습니다. 문자열은 다른 목록에있는 객체의 속성입니다. 목록에서 무언가를 선택할 때, 나는 관련 객체를 선택하기 위해 인덱스를 사용합니다 (물론리스트에서 그 인덱스와 같은 인덱스를가집니다). 그러나 목록을 (이름으로) 정렬 할 때 각 문자열의 색인이 변경되므로 갑자기 잘못된 개체와 관련이 있습니다.인덱스를 변경하지 않고 목록 상자를 정렬하는 방법

내 질문에, 인덱스를 변경하지 않고 목록을 정렬 할 가능성이 있습니다.

for(int i = 0; i < myObjects.Count; i++) 
{ 
    var lItem = new ListBoxItem(); 
    lItem.Tag = myObjects[i]; 
    // do some other things... 
} 

을 그래서 나중에이 수행 할 수 있습니다 : 당신이 경우

ListBoxItem li = // again the selected item 
MyObject obj = li.Tag as MyObject; 

답변

2

당신은 단지 ListItem에 개체를 연결하여 모든 인덱스를 처리하는 것을 피하기 Tag 속성을 수 사용 실제로 색인을 처리하려는 경우 원래 색인을 Tag으로 추가 할 수 있습니다. 그런 식으로 그들이 나타나는 순서는 원래의 개체 순서에 영향을 미치지 않습니다.

for(int i = 0; i < myObjects.Count; i++) 
{ 
    var lItem = new ListBoxItem(); 
    lItem.Tag = i; 
    // add other values to your item 
} 

그리고 나중에 :

ListBoxItem li = // your selected item 
MyObject obj = myObjects[(int)li.Tag]; 
2

가 왜 인덱스의 값 intead에 의해 확인하지 않습니다. 값은 항상 사용자가 찾는 값입니다. 목록 상자의 색인은 객체가 위에서부터 시작하는 위치에 해당하므로 정렬 할 때 색인이 변경됩니다.

1

나는 germi의 대답 @ 선호하지만, 여기에 대안이다 :

  1. 문자열의 목록과 같은 크기의 인덱스의 배열을 만듭니다.
  2. 문자열 사본입니다 (다음 단계로 인해 목록이 아닌 배열이 필요합니다)
  3. Array.Sort<TKey, TValue>(TKey[] keys, TValue[] items)을 사용하면 문자열과 색인을 함께 정렬 할 수 있습니다.
  4. 목록 상자에 정렬 된 문자열 배열을 사용하십시오.
  5. 목록 상자에서 색인을 다시 가져올 때이를 사용하여 정렬 된 색인 배열을 통해 원래 색인을 찾습니다.

    List<string> strings = new List<string>() {"Zero", "One", "Two", "Three", "Four", "Five"}; 
    
    var stringsArr = strings.ToArray(); 
    var indices = Enumerable.Range(0, strings.Count).ToArray(); 
    
    Array.Sort(stringsArr, indices); 
    
    for (int i = 0; i < stringsArr.Length; ++i) 
        Console.WriteLine("{0} has original index {1}", stringsArr[i], indices[i]); 
    
    // Add stringsArr to the listbox. 
    // If an index from the listbox is lbi, then the original index of the item 
    // that it refers to will be indices[lbi] 
    
    :

예를 들어,이 코드를 고려

관련 문제