2013-01-17 68 views
1

字符串如果你給出隨機前綴的數組,像這樣:排序基於前綴

DOG_BOB 
CAT_ROB 
DOG_DANNY 
MOUSE_MICKEY 
DOG_STEVE 
HORSE_NEIGH 
CAT_RUDE 
HORSE_BOO 
MOUSE_STUPID 

我怎麼會去選,這樣我有一個字符串的4個不同的陣列/列表?

所以最終的結果都會給我4個字符串數組或列表與

DOG_BOB,DOG_DANNY,DOG_STEVE <-- Array 1 
HORSE_NEIGH, HORSE_BOO <-- Array 2 
MOUSE_MICKEY, MOUSE_STUPID <-- Array 3 
CAT_RUDE, CAT_ROB <-- Array 4 

遺憾的名字我只是做起來笑

var fieldNames = typeof(animals).GetFields() 
        .Select(field => field.Name) 
        .ToList(); 
List<string> cats = new List<string>(); 
List<string> dogs = new List<string>(); 
List<string> mice= new List<string>(); 
List<string> horse = new List<string>(); 
foreach (var n in fieldNames) 
{ 
    var fieldValues = typeof(animals).GetField(n).GetValue(n);" 

    //Here's what i'm trying to do, with if statements 
    if (n.ToString().ToLower().Contains("horse")) 
    { 
    } 
} 

所以我需要他們能夠分裂成STRING陣列/字符串列表不是隻是字符串

回答

2
string[] strings = new string[] { 
         "DOG_BOB", 
         "CAT_ROB", 
         "DOG_DANNY", 
         "MOUSE_MICKEY", 
         "DOG_STEVE", 
         "HORSE_NEIGH", 
         "CAT_RUDE", 
         "HORSE_BOO", 
         "MOUSE_STUPID"}; 

string[] results = strings.GroupBy(s => s.Split('_')[0]) 
          .Select(g => String.Join(",",g)) 
          .ToArray(); 

或者,也許這樣的事情

List<List<string>> res = strings.ToLookup(s => s.Split('_')[0], s => s) 
           .Select(g => g.ToList()) 
           .ToList(); 
+0

我如何得到它在不同的字符串?不只是一個數組,我想要4個不同的字符串數組或列表。 – Ramie

+0

@Ramie * results *是「4個字符串」,其中的每個項目都包含您想要的字符串。只是循環它。 – I4V

+0

我的意思是像4個字符串數組或4個字符串列表分類的前綴 – Ramie

0
foreach (String s in strings) 
{ 
    if (s.StartsWith("CAT_") 
     cats.Add(s); 
    else if (s.StartsWith("HORSE_") 
     horses.Add(s); 
    // ... 
} 

或者:

foreach (String s in strings) 
{ 
    String[] split = s.Split(new Char [] { '_' }); 

    if (split[0].Equals("CAT") 
     cats.Add(s); 
    else if (split[0].Equals("HORSE") 
     horses.Add(s); 

    // ... 
} 

但我更喜歡第一個。

0

從算法,我會做到以下幾點:

  1. 通過使用「_」作爲分隔符解析出的所有獨特的前綴。

  2. 循環顯示前綴列表。 2a。檢索任何具有您的前綴的值(循環/查找/正則表達式/取決於結構) 2b。將檢索到的值放在列表中。 2c。排序列表。

  3. 輸出你的結果,或做你的收藏需要。

+0

解析出的基於客「_」是,你可以在以後用新的前綴,使用這種方法的優點。 –

0

使用LINQ,使用類似

names.GroupBy(s => s.Substring(0, s.IndexOf("_"))) // group by prefix 
    .Select(g => string.Join(",", g))    // join each group with commas 
    .ToList();         // take the results 

See it in action(一些額外.ToArray()調用包含對.NET 3.0的兼容性)

2
var groups = fieldNames.GroupBy(n => n.Split('_')[0]); 

使用

foreach(var group in groups) 
{ 
    // group.Key (DOG, HORSE, CAT, etc) 

    foreach(var name in group) 
     // all names groped by prefix 
} 
0

這LINQ表達你想要做什麼。

var result = data.GroupBy(data.Split('_')[0]) 
       .Select(group => String.Join(", ", group)) 
       .ToList(); 

有關字符串列表的列表,請使用此表達式。

var result = data.GroupBy(data.Split('_')[0]) 
       .Select(group => group.ToList()) 
       .ToList(); 
+0

我如何得到它在不同的字符串?不只是一個數組,我想要4個不同的字符串數組或列表。 – Ramie

+0

只需省略'String.Join()' - 更新我的答案。 –

0

您可以通過前綴訂購列表前面和排序:

 string[] input = new string[] {"DOG_BOB","CAT_ROB","DOG_DANNY","MOUSE_MICKEY","DOG_STEVE","HORSE_NEIGH","CAT_RUDE","HORSE_BOO","MOUSE_STUPID"}; 
     string[] sortedInput = input.OrderBy(x => x).ToArray(); 
     var distinctSortedPrefixes = sortedInput.Select(item => item.Split('_')[0]).Distinct().ToArray(); 

     Dictionary<string, string[]> orderedByPrefix = new Dictionary<string, string[]>(); 
     for (int prefixIndex = 0; prefixIndex < distinctSortedPrefixes.Length; prefixIndex++) 
     { 
      string prefix = distinctSortedPrefixes[prefixIndex]; 
      var group = input.Where(item => item.StartsWith(prefix)).ToArray(); 
      orderedByPrefix.Add(prefix, group); 
     }