2016-05-09 2 views
-2

私はフィルタリングする必要があるファイル名を表す文字列部分をList<string>としています。文字「&」の前にあるものはすべて消去する必要があります。リストから文字列の一部を削除する<string>

List<string> zippedTransactions = new List<string>(); 
zippedTransactions.Add("33396&20151007112154000549659S03333396SUMMARIES.PDF"); 
zippedTransactions.Add("33395&20151007112400000549659S03333395SUMMARIES.PDF"); 
zippedTransactions.Add("33397&20151007112555000549659S03333397SUMMARIES.PDF"); 

// desired output: 
// "20151007112154000549659S03333396SUMMARIES.PDF"; 
// "20151007112400000549659S03333395SUMMARIES.PDF"; 
// "20151007112555000549659S03333397SUMMARIES.PDF" 

NOTE:C#はデータ構造のこの種と相互作用する機能インタフェースの豊富を提供するので、私は、それを古典的な反復様式の外観を与えるためにしたくない、私はそれを使用して起動します。

+2

さて、まだ何か試しましたか?私は2つのステップでこれに取り組むことをお勧めします:1)*単一の*入力文字列の望ましい値を得る方法を探します。 2)それをストリングのリストにどのように適用するかを検討します。 –

+0

私はforeachを使用するアプローチを持っていますが、私はループの反復を避けたいと思います。 – Shivam

+2

さて、*何かが反復しなければならないでしょうか? LINQを使って反復をライブラリコードに移すことができますが、それでも反復が必要になります。 –

答えて

6

は正規表現と1つのLINQのアプローチですが

Transactions = Transactions.Select(x => Regex.Replace(x, ".*&", string.Empty)).ToList(); 

これは、Split('&')[1]場合にはあなたのファイル名に&

+0

です。少なくとも私は古いforeachを繰り返し使用していません。 – Shivam

+0

素晴らしいですが、それでも内部的には繰り返しが必要です。 –

0

コードがあなた

for (int i = 0; i < zippedTransactions.Count; i++) 
{ 
    string[] result = zippedTransactions[i].Split('&'); 
    zippedTransactions[i] = result[result.Length-1]; 
} 
+0

正しくはありません。これは、 'result'の長さチェックを必要とするだけでなく、文字列に複数の&文字があれば正しく動作しません。最後の部分だけが必要です。 String.Splitは常に配列内に少なくとも1つの結果を与えるので、より良い解決策は 'zippedTransactions [i] = result [result.Length-1];' – Nyerguds

0

利用のstring.Split希望の文字で文字列を分割し、必要な部分を取得するのに役立ちます、次:ここでは

foreach (var item in zippedTransactions) 
{ 
    string[] result = item.Split('&'); 
    Console.WriteLine(result[1]); 
} 
0

これは

for (int i = 0; i < zippedTransactions.Count; i++) 
       { 
        zippedTransactions[i] = zippedTransactions[i].Split('&')[1]; 
       } 
0

あなたは、文字列内の文字の位置を見つけるために、string.IndexOf機能を使用することができます試してみて、その後、文字を削除するstring.Removeを使っありませんそれまで:

for(int i =0; i < zippedTransactions.Count; i++) 
{ 
    int count = zippedTransactions[i].IndexOf("&") + 1; 
    zippedTransactions[i] = zippedTransactions[i].Remove(0, count); 
} 
+2

コードのみの回答を投稿するのではなく、回答を説明するためにいくつかの単語を追加するとよい – Shreevardhan

0

Visual Studioを持って起こる、とC# Interactiveをサポートするバージョンならば、私はあなたがこれを試して示唆しています。

> zippedTransactions = new List<string>() { 
    "33396&20151007112154000549659S03333396SUMMARIES.PDF", 
    "33395&20151007112400000549659S03333395SUMMARIES.PDF", 
    "33397&20151007112555000549659S03333397SUMMARIES.PDF" 
    }; 
> 
> zippedTransactions.Select(dirname => dirname.Split('&')[1]) 
Enumerable.WhereSelectListIterator<string, string> { "20151007112154000549659S03333396SUMMARIES.PDF", "20151007112400000549659S03333395SUMMARIES.PDF", "20151007112555000549659S03333397SUMMARIES.PDF" } 
> 

あなたがそうでなくても、コードを見るだけで何が起こっているのかを知ることができます。

WhereSelectListIteratorは、データ構造上で実行するロジックを保持するデータ構造体です。あなたがそれを消費したときだけ評価されます(例えば、ループが実際に起こると読まれます)。最後に.ToList()を呼び出します。

このコードでは、文字列を '&'に分割した後の2番目の要素しかないので、一般化したり、要件に合わせて調整したりすることができます。

関連する問題