2015-06-26 35 views
0

如果我們想以特殊形式對string Array進行排序,我們需要做什麼?
例如,我們有這樣的:特殊風格的字符串數組排序

players = new string[12] {"soccer","12","man","swim","3","woman","volleyball","12","man","baseball","13","man"}; 

現在我們想通過這種形式進行排序Array:(它只是我的願望秩序,沒有任何邏輯)

sort = new string[4] {"swim","baseball","volleyball","soccer"} 

終於有:

OUT = [{游泳,3,女人},{棒球,如圖13所示,人},{排球,12,人},{足球,12,人}]

+4

很抱歉,但我不明白這裏你的邏輯......爲什麼不創建選手對象呢? – Mivaweb

+0

什麼是邏輯?爲什麼在棒球之前游泳?爲什麼足球是在棒球之後來的? – dotctor

+0

其不是AI應該有一些創建集合的邏輯 –

回答

3

其他的答案做一個好點的有關創建一個類來保存你的數據,但它可以沒有它來完成:

var ordered = Enumerable.Range(0, players.Length/3) 
.Select(i => new string[] { players[i*3], players[i*3+1], players[i*3+2] }) 
.OrderBy(a => Array.IndexOf(sort, a[0])) 
.ToArray(); 

如果您在播放器陣列中有不存在於排序數組中的運動,則可以將它們濾除。從Mivaweb複製

var ordered = (from i in Enumerable.Range(0, players.Length/3) 
let index = Array.IndexOf(sort, players[i*3]) 
where index >= 0 
select new string[] { players[i*3], players[i*3+1], players[i*3+2] } 
).OrderBy(a => Array.IndexOf(sort, a[0])).ToArray(); 
+0

我必須說,很有意思的方法 –

+0

不錯。但我的願望項目在我陣列的最後。在我的球員名單中,我們有另一項運動,我們不希望在我的結果中顯示。像「國際象棋」。 –

+0

@EhsanDavoudi請參閱編輯;) –

3

你有一個很大的字符串數組,它包含了你所有的玩家細節。 這不是最好的解決方案。

創建包含所有屬性的播放器對象,並將其放入數組中。

然後您可以創建自定義排序。

Player對象:

public class Player { 
    public string Type { get; set; } 
    public string Gender { get; set; } 
    public int AmountOfPlayers { get; set; } 
    public int Order { get; set; } 
} 

創建播放器對象的數組列表:

List<Player> list = new List<Player>(); 
list.Add(new Player() { Type = "swim", Gender = "women", AmountOfPlayers = 3, Order = 1 }); 
list.Add(new Player() { Type = "soccer", Gender = "men", AmountOfPlayers = 12, Order = 4 }); 
list.Add(new Player() { Type = "volleyball", Gender = "men", AmountOfPlayers = 12, Order = 3 }); 
list.Add(new Player() { Type = "baseball", Gender = "men", AmountOfPlayers = 13, Order = 2 }); 

排序:

var sortedList = list.OrderBy(c => c.Order); 
+2

排序錯誤(他有一個特定的排序...首先,足球最後)...和'OrderBy'不是... ...它返回一個新的排序'IEnumerable <>' – xanatos

+0

@Mivaweb相同* * xanatos **說,這不是真的。因爲在用'Type'排序後,我們不會有我想要的結果。 –

+0

查看更新排序 – Mivaweb

1

你可以試試這個方法。首先創建一個類從初始string[]的,它可以代表所有的格式如下所示的值:

Class Sport 
{ 
    public string Name {get; set;} 
    public int Number {get; set;} 
    public string Gender {get; set;} 
} 

一旦你的集合作爲List<Sport> sportList,現在你需要創建一個自定義IComparer做必要的排序:

class SportSorter : IComparer<Sport> 
{   
    public int Compare(Sport x, Sport y) 
    { 
     int retVal = 0;    
     retVal = string.Compare(x.Name,y.Name); 
     return retVal; 
    } 
} 

現在簡單的,你可以通過使用SportSorter

SportSorter ss = new SportSorter(); 

sportList.Sort(ss); 

的實例調用請注意,現在我正在使用Name屬性進行排序,同樣可以在CustomSorter (IComparer)代碼中進行更改。與OrderBy相比,這是一個穩定版本,使用QuickSort。如果你想在不同的方向鏈中的多個分揀在一起,然後檢查以下回應:

Sort List of Dictionary using IComparer instead of OrderBy

而且使用Sort代替OrderBy將確保排序相同的內存,如做了不創建一個新的列表OrderBy

1

代碼:

public class Player { 
    public string Type { get; set; } 
    public string Gender { get; set; } 
    public int AmountOfPlayers { get; set; } 
} 

然後

List<Player> list = new List<Player>(); 
list.Add(new Player() { Type = "swim", Gender = "women", AmountOfPlayers = 3 }); 

我的代碼:

public static readonly string[] Order = new string[4] {"swim","baseball","volleyball","soccer"}; 

public static int OrderOf(string str) 
{ 
    int ix = Array.IndexOf(Order, str); 
    if (ix == -1) 
    { 
     ix = int.MaxValue; 
    } 
    return ix; 
} 

然後對它進行排序:

list.Sort((p, q) => OrderOf(p.Type).CompareTo(OrderOf(q.Type))); 

list.Sort()是 「到位」,因此它直接改變list。請注意,如果場上有不同的運動項目,他們將進入有序列表的第一位。

OrderOf使用Array.IndexOf找到Order陣列中的一種運動類型的索引。未知的運動類型最後。

1

這實際上沒有任何排序,但如果你想處理這些數據,你可以使用下面的方法,但這不是好方法。

string[,] outArray = new string[sort.Length, 3]; 
     for (int i = 0; i < sort.Length; i++) 
     { 
      int pos = Array.IndexOf(players, sort[i]); 
      outArray[i, 0] = players[pos]; 
      outArray[i, 1] = players[pos + 1]; 
      outArray[i, 2] = players[pos + 2]; 
     } 

使用對象,集合和lambda/LINQ來獲得高效的解決方案,我猜所有上述答案都遵循更好的方法。

2

雖然我會建議其他人說明的面向對象的方法。但是,如果由於一些保留,你不能這樣做,那麼這將工作。

string[] players = new string[15] {"soccer","12","man","swim","3","woman","volleyball","12","man","baseball","13","man" 
    ,"chess","18","man"}; 
string[] sort = new string[4] {"swim","baseball","volleyball","soccer"}; 
string[] playersSorted= new string[sort.Length*3]; 
int destStartIndex = 0; 
foreach(string str in sort) 
{ 
    int sourceStartIndex = Array.IndexOf(players,str); 
    Array.Copy(players, sourceStartIndex, playersSorted, destStartIndex, 3); 
    destStartIndex += 3; 
} 

DEMO

+0

請注意,Array.IndexOf是一個O(n)操作,其中n是數組的長度,如果您只有幾項運動,它可能沒問題。 – Seph