C# 根据前缀对字符串排序

C# 根据前缀对字符串排序,c#,.net,sorting,arrays,C#,.net,Sorting,Arrays,如果给您一个带有随机前缀的数组,如下所示: 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 MO

如果给您一个带有随机前缀的数组,如下所示:

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"))
    {
    }
}
所以我需要将它们拆分为字符串数组/字符串列表,而不仅仅是字符串

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

但是我更喜欢第一个

或:


但我更喜欢第一个。

从算法上讲,我会做以下工作:

使用u作为delimeter,解析出所有唯一的前缀

循环浏览前缀列表。 2a。检索前缀为loop/find/regex/依赖于结构的任何值 2b。将检索到的值放入列表中。 2c。排序列表

输出结果,或对集合执行所需操作


从算法上讲,我会做以下工作:

使用u作为delimeter,解析出所有唯一的前缀

循环浏览前缀列表。 2a。检索前缀为loop/find/regex/依赖于结构的任何值 2b。将检索到的值放入列表中。 2c。排序列表

输出结果,或对集合执行所需操作


对于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调用包括.NET3.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
var groups = fieldNames.GroupBy(n => n.Split('_')[0]);
一些额外的.ToArray调用包括.NET3.0兼容性

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

用法

或者像这样的

List<List<string>> res = strings.ToLookup(s => s.Split('_')[0], s => s)
                                 .Select(g => g.ToList())
                                 .ToList();
或者像这样的

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

此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();

此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();

您可以提前对列表排序并按前缀排序:

        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);
        }    

您可以提前对列表排序并按前缀排序:

        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);
        }    

基于out-based-off的解析的优点是,您可以在以后将其与新前缀一起使用。基于out-off的解析的优点是,您可以在以后将其与新前缀一起使用。如何在不同的字符串中获取它?不仅仅是一个数组,我需要4个不同的字符串数组或列表。@Ramie results是4个字符串,其中的每个项目都包含您想要的字符串。我的意思是像4个字符串数组或4个字符串列表,按prefix@Ramie我知道。运行代码并查看结果如何。我敢打赌这是你想要的。我怎样才能在不同的字符串中得到它?不仅仅是一个数组,我需要4个不同的字符串数组或列表。@Ramie results是4个字符串,其中的每个项目都包含您想要的字符串。我的意思是像4个字符串数组或4个字符串列表,按prefix@Ramie我知道。运行代码并查看结果如何。我敢打赌这是你想要的。我怎样才能在不同的字符串中得到它?不只是一个数组,我需要4个不同的字符串数组或列表。只需省略string.Join-更新我的答案。如何在不同的字符串中获得它?不仅仅是一个数组,我需要4个不同的字符串数组或列表。只需省略string.Join-更新我的答案。