2012-10-03 4 views
6

この質問は、学術目的のみのものです。 文字列に参加する[]を使用しないstring.Join

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

...

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の声明を見つけるように見えることはできません...うまくいけば、あなたはすでに知っている!

+2

興味深い答えをしていますが、別のアプローチを探している、なぜ私は、好奇心が強いですストリングより。ジョイン?そしてまた、あなたはLinqの声明を探していると言いますが、あなたの受け入れられた答え(確かに良いもの)はLinqをまったく使っていません:) – Wasp

+0

@Wasp、再び質問は学問的でした。さらに、私はLINQを介して解決する必要があると言って__not__を意味しましたが、私はLINQステートメントを探していましたので、それは最善のアプローチだったので___thought___です。しかし、結局、Guffaはもっと完璧な方法を教えてくれました。 –

+1

それでは、この文字列の最後の部分を無視してコンマを取り除くにはどうすればよいのでしょうか?あなたは幸運を得て答えを得ましたが、あなたが答えた答えはありません。 –

答えて

4

ちょうど最後のカンマを検索し、文字列を分割するSubstringを使用して、どちらかSplitを使用しないでください:

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)); 
+0

全体的には非常に良い回答とベストなアプローチ。私はあなたの答えを編集するつもりです。なぜなら、新しい要件が生まれ、人々に見てほしいからです( 'name'フィールドはCSVでファイルを送信しているにもかかわらず、カンマを持つことができます。 )より良い区切り文字?) –

+0

@Mike:そうです、あなたはカンマなしで文字列に参加していました。 'Replace'を使って最初の文字列から削除することができます。 – Guffa

+0

私は間違っていた! 2つの値しかなく、毎回最後の位置に部分文字列を実行したので、変更する必要はありませんでした。非常に、非常に、非常に良い解決策とそれは非常に効率的です! –

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; 
+0

これは正しいですが、パフォーマンスは2次です。 –

+0

すごく遅いです... – SimpleVar

+1

+1 ... @YoryeNathan、これは完全に容認できる解決策です。二次ランタイムですが、たぶんユースケースの場合、これは 'StringBuilder'を使用したソリューションよりも*高速*です:OPのコードを見ると、これは' name'というXML属性値を設定するために使われます。コレクションがあると思いますか? –

6

O(N)性能のためStringBuilderを使用する:

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

オブジェクトを回避することである場合組み合わされたLINQ呼び出しと静的メソッドのツリーの厄介さ、単純な解決策はexte nsion方法:

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

そして:

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

は、私は、これは複雑な式でstring.Joinを使用するよりもはるかに良いを読むことを見つけます。

+0

良い解決策のために+1 –

0
var strs = new string[100]; 
... 

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

最後の "、"を今すぐ削除する必要があります。

+0

'StringBuilder'サイズを与えるとスピードアップが得られますが、漸近的なスピードアップは得られません。これは、「合計」からのオーバーヘッドよりも小さい場合があります。 –

+0

値打ち。 – SimpleVar

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)); 
関連する問題