6

この質問は学術目的のみです。

私が次のコードを持っていると仮定しましょう...

var split = line.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries);
var elem = new XElement("shop");
elem.SetAttributeValue("name", split.Take(split.Length - 1));  <=====
elem.SetAttributeValue("tin", split.Last());

そして、矢印の付いた線でこれと同じ結果が得られるようにしたいと思います...

string.Join(string.Empty, split.Take(split.Length - 1));

...を使用せずにstring.Join

それは可能ですか?私はそれを行うためのLINQステートメントを見つけることができないようです...うまくいけば、あなたはすでに知っています!

4

5 に答える 5

6

StringBuilderfor O(n)パフォーマンスの使用:

split
    .Take(split.Length - 1)
    .Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();

目的が、結合されたLINQ呼び出しと静的メソッドのツリーの厄介さを回避することである場合、簡単な解決策は拡張メソッドです。

public static string Join(this IEnumerable<string> self, string separator = "")
{
    return string.Join(separator, self);
}

その後:

split.Take(split.Length - 1).Join();

string.Join複雑な表現で使うよりもずっと読みやすいと思います。

于 2012-10-03T18:13:36.500 に答える
4

どちらも使用しないでくださいSplit。最後のコンマを見つけてSubstring、文字列を分割するために使用してください。

int pos = line.LastIndexOf(',');
var elem = new XElement("shop");
elem.SetAttributeValue("name", line.Substring(0, pos).Replace(",", String.Empty));
elem.SetAttributeValue("tin", line.Substring(pos + 1));
于 2012-10-03T18:20:50.607 に答える
2

どうですか

split.Take(split.Length - 1).Aggregate((s1,s2)=> s1 + s2);

またはlinq以外の同等のもの:

string s = "";
for(int i = 0; i < split.Length - 1; i++)
{
   s += split[i];
}
return s;
于 2012-10-03T18:12:02.797 に答える
0
var strs = new string[100];
...

var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)),
                            (sb, curr) => sb.Append(s + ", ")).ToString();

最後の「、」を最後から削除する必要があります。

于 2012-10-03T18:15:11.660 に答える
0
string myString = "Hello World"
var myList= new List<int>();

for (int i = 0; i < 10; i++)
    myList.Add(i);

var newList = myList.Aggregate(string.Empty, (current, num) => current + myString.Substring(num, 1));
于 2012-10-03T18:41:02.827 に答える