Split a separated string into hierarchy using c# and linq

后端 未结 4 1452
粉色の甜心
粉色の甜心 2021-02-14 23:28

I have string separated by dot (\'.\') characters that represents a hierarchy:

string source = \"Class1.StructA.StructB.StructC.FieldA\";

How c

相关标签:
4条回答
  • 2021-02-14 23:39

    Here is solution that uses aggregation:

    const string separator = ".";
    const string source = "Class1.StructA.StructB.StructC.FieldA";
    
    // Get the components.
    string[] components = source.Split(new [] { separator }, StringSplitOptions.None);
    
    List<string> results = new List<string>();
    // Aggregate with saving temporary results.
    string lastResult = components.Aggregate((total, next) =>
        {
            results.Add(total);
            return string.Join(separator, total, next);
        });
    results.Add(lastResult);
    
    0 讨论(0)
  • 2021-02-14 23:46

    Here's a solution completely without LINQ:

    public static string[] GetHierarchy(this string path)
    {
        var res = path.Split('.');
        string last = null;
        for (int i = 0; i < res.Length; ++i)
        {
            last = string.Format("{0}{1}{2}", last, last != null ? "." : null, res[i]);
            res[i] = last;
        }
        return res;
    }
    
    0 讨论(0)
  • 2021-02-14 23:49

    Split the string by the delimiters taking 1...N of the different levels and rejoin the string.

    const char DELIMITER = '.';
    var source = "Class1.StructA.StructB.StructC.FieldA";
    var hierarchy = source.Split(DELIMITER);
    var result = Enumerable.Range(1, hierarchy.Length)
        .Select(i => String.Join(".", hierarchy.Take(i)))
        .ToArray();
    

    Here's a more efficient way to do this without LINQ:

    const char DELIMITER = '.';
    var source = "Class1.StructA.StructB.StructC.FieldA";
    var result = new List<string>();
    for (int i = 0; i < source.Length; i++)
    {
        if (source[i] == DELIMITER)
        {
            result.Add(source.Substring(0, i));
        }
    }
    result.Add(source); // assuming there is no trailing delimiter
    
    0 讨论(0)
  • 2021-02-14 23:54

    Shlemiel the painter approach is better than the "super Shlemiel" string.Join in this case.

            const char DELIMITER = '.';
    
            string soFar = "";
            List<string> result = source.Split(DELIMITER).Select(s =>
            {
                if (soFar != "") { soFar += DELIMITER; };
                soFar += s;
                return soFar;
            }).ToList();
    
    0 讨论(0)
提交回复
热议问题