2015-01-09 52 views
0

我有一個具有兩個屬性,名稱和位置的項目數組。數組未按任何方式排序,我想按位置順序填充列表框。如何填充排序的未排序數組列表框

我可以用下面的代碼來做到這一點,首先我添加所有項目,所以我有一個正確數量的項目列表,然後在正確的位置替換項目。但我想知道是否有更好的方法來做到這一點?

我希望列表框中的名稱按以下順序排列:Mark,John和James。

注意:詹姆斯,馬克和約翰的數據只是一個例子,我無法對常設數組進行排序。

public class _standing 
{ 
    public _standing(string _name, int _pos) { 
     name = _name; 
     position = _pos; 
    } 
    public string name { get; set; } 
    public int position { get; set; } 
} 

_standing a = new _standing("James", 2); 
_standing b = new _standing("Mark", 0); 
_standing c = new _standing("John", 1); 
_standing[] standing = new _standing[]{a, b, c}; 

for (int i = 0; i < standing.Length; i++) { 
    listBox1.Items.Add(standing[i].name); 
} 
for (int i = 0; i < standing.Length; i++) { 
    listBox1.Items.RemoveAt(standing[i].position); 
    listBox1.Items.Insert(standing[i].position, standing[i].name); 
} 
+0

不是數組的,使用泛型列表<_standing>考慮。然後你可以對列表進行排序。還要考慮爲您的課程使用標準命名約定:常規(大寫且不包含下劃線)。 – DeborahK 2015-01-09 20:28:28

回答

1

你可以只使用數組的OrderBy方法:

standing = standing.OrderBy(i => i.position).ToArray(); 
listBox1.Items.AddRange(standing); 

你也可以爲了通過decscending:

standing.OrderByDescending(i => i.position).ToArray(); 

這些都需要以System.Linq

另外一個參考,因爲OrderBy返回一個新的對象,你也可以做到這一點,而無需重新訂購您最初的名單:

_standing a = new _standing("James", 2); 
_standing b = new _standing("Mark", 0); 
_standing c = new _standing("John", 1); 
_standing[] standing = new _standing[] { a, b, c }; 

listBox1.Items.AddRange(standing.OrderBy(i => i.position).ToArray()); 

更新

爲了顯示一些有意義的事情在你的listBox1中,你應該重寫ToString方法對你_standing類,類似:

public class _standing 
{ 
    public string name { get; set; } 
    public int position { get; set; } 

    public _standing(string _name, int _pos) 
    { 
     name = _name; 
     position = _pos; 
    } 

    public override string ToString() 
    { 
     return position + ": " + name; 
    } 
} 

最後,我不得不提到您的外殼/命名約定不是標準的C#。標準是Classes和Properties是PascalCase,參數是camelCase,私有字段是pascalCase,帶有可選的下劃線前綴。所以,你的代碼將非常類似於:

public class Standing 
{ 
    public string Name { get; set; } 
    public int Position { get; set; } 

    public Standing(string name, int position) 
    { 
     Name = name; 
     Position = position; 
    } 

    public override string ToString() 
    { 
     return Position + ": " + Name; 
    } 
} 

和...

Standing a = new Standing("James", 2); 
Standing b = new Standing("Mark", 0); 
Standing c = new Standing("John", 1); 
Standing[] standing = { a, b, c }; 

listBox1.Items.AddRange(standing.OrderBy(i => i.Position).ToArray()); 
+0

我得到這個錯誤消息時嘗試:不能隱式地將類型'System.Linq.IOrderedEnumerable '轉換爲'testApplikation._standing []' – hericson 2015-01-09 20:49:27

+0

對不起,用ToArray()更新代碼 – 2015-01-09 20:51:54

+0

還用更簡單的方法更新:) – 2015-01-09 20:54:08

0

如果我是你,我會首先創建一個_standing列表並添加到列表中。例如:

List<_standing> standingList = new List<_standing>(); 
standingList.Add(new _standing("James", 2)); 
etc... 

在數組類型上使用列表的優點是它的大小是動態的。如果你只有3個_standing物體,那麼陣列是好的,但實際上可能不是這樣。

然後你可以使用LINQ查詢的位置

IEnumerable<_standing> sorted = standingList.OrderBy(stand => stand.Position); 

對列表進行排序,現在您可以選擇使用內置的排序算法.NET排序列表,你可以添加到您的控制項集合。

listBox1.Items.AddRange(sorted); 

來源以供參考:您可以通過使用的AddRange方法節省時間

+0

我相信'AddRange'方法需要一個數組,而不是'IEnumerable',所以你不得不這樣做:'listBox1.Items.AddRange(sorted.ToArray());' – 2015-01-09 21:20:46