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"))
    {
    }
}

したがって、文字列だけでなく、文字列配列/文字列リストに分割する必要があります

4

7 に答える 7

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
}
于 2013-01-17T20:43:32.397 に答える
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();
于 2013-01-17T20:44:12.437 に答える
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);
        }    
于 2013-01-17T20:57:43.667 に答える
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);

    // ...
}

しかし、私は最初のものを好みます。

于 2013-01-17T20:39:38.130 に答える
0

アルゴリズム的に、私は次のことを行います。

  1. 区切り文字として「_」を使用して、すべての一意のプレフィックスを解析します。

  2. プレフィックスのリストをループします。2a。プレフィックス(loop / find / regex /構造に依存)を持つ値を取得します2b。取得した値をリストに配置します。2c。ソートリスト。

  3. 結果を出力するか、コレクションで必要なことを実行します。

于 2013-01-17T20:41:42.710 に答える
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

実際の動作を確認してください.ToArray()( .NET 3.0との互換性のためにいくつかの追加の

于 2013-01-17T20:43:12.213 に答える
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();
于 2013-01-17T20:53:41.137 に答える