我有一個列表框,我從List中填充。字符串是另一個列表中對象的屬性。從列表中選擇一些東西時,我使用索引來選擇相關對象(當然這與索引列表中的名稱相同)。但是,當我排序列表(按名稱)每個字符串的索引更改,所以他們突然與錯誤的對象有關。如何在不更改索引的情況下對列表框進行排序
所以我的問題是,有沒有排序列表的可能性,而不改變其索引。
我有一個列表框,我從List中填充。字符串是另一個列表中對象的屬性。從列表中選擇一些東西時,我使用索引來選擇相關對象(當然這與索引列表中的名稱相同)。但是,當我排序列表(按名稱)每個字符串的索引更改,所以他們突然與錯誤的對象有關。如何在不更改索引的情況下對列表框進行排序
所以我的問題是,有沒有排序列表的可能性,而不改變其索引。
使用Tag
屬性,你可不必通過只是你的物體連接到ListItem
在所有處理索引:
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;
如果您真的想要處理索引,您可以將原始索引作爲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];
你爲什麼不通過索引值這一翻譯檢查。價值永遠是你要找的人。列表框中的索引對應於對象從頂部開始的地方,因此當對它進行排序時,索引將會改變。
我喜歡@ germi的答案,但在這裏是一種替代方案:
Array.Sort<TKey, TValue>(TKey[] keys, TValue[] items)
將字符串和索引一起排序。例如,考慮下面的代碼:
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]