を使用して階層に分かれた文字列私は、ドットで区切られた文字列を(「」)持つ文字:スプリットC#とLINQ
string source = "Class1.StructA.StructB.StructC.FieldA";
どのように私は別のに文字列を分割するためにC#とLINQを使用することができますその階層を示す文字列?次のようになります。
を使用して階層に分かれた文字列私は、ドットで区切られた文字列を(「」)持つ文字:スプリットC#とLINQ
string source = "Class1.StructA.StructB.StructC.FieldA";
どのように私は別のに文字列を分割するためにC#とLINQを使用することができますその階層を示す文字列?次のようになります。
異なるレベルの1 ... Nを取り、区切り文字で区切り文字列を分割して再結合します。ここで
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();
は、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
は、集約を使用するソリューションです:
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);
はここで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;
}
Shlemiel画家approac hは "super Shlemiel"ストリングよりも優れています。この場合はジョイントしてください。
const char DELIMITER = '.';
string soFar = "";
List<string> result = source.Split(DELIMITER).Select(s =>
{
if (soFar != "") { soFar += DELIMITER; };
soFar += s;
return soFar;
}).ToList();
エレガントな解決策 –
優れた答え。 linqの解決策は重要です。なぜなら、私はxmlから100を読み込み、それらを一緒に自動生成されたクラスにグループ化するからです。 – sean