3

私はC#4.0を使用していますが、文字列全体を4語ごとに分割し、それをListオブジェクトに格納する必要がある状況に遭遇しました。したがって、私の文字列に次のものが含まれているとします。 "USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53"、結果は次のようになります。

USD 1.23 1.12 1.42
EUR 0.2 0.3 0.42
JPY 1.2 1.42 1.53

Listオブジェクトに保存されます。私は以下を試しました

List<string> test = new List<string>(data.Split(' ')); //(not working as it splits on every word)
4

4 に答える 4

9

少しLinqの魔法で:

var wordGroups = text.Split(' ')
                     .Select((word, i) => new { Word = word, Pos = i })
                     .GroupBy(w => w.Pos / 4)
                     .Select(g => string.Join(" ", g.Select(x=> x.Word)))
                     .ToList();
于 2012-08-18T22:34:00.820 に答える
5

もちろん、私の答えはlinqの答えほど魅力的ではありませんが、このold school方法を投稿したいと思います。

void Main()
{
    List<string> result = new List<string>();

    string inp = "USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53";
    while(true)
    {
        int pos = IndexOfN(inp, " ", 4);
        if(pos != -1)
        {
            string part = inp.Substring(0, pos);
            inp = inp.Substring(pos + 1);
            result.Add(part);
        }
        else
        {
            result.Add(inp);
            break;
        }
    }
}

int IndexOfN(string input, string sep, int count)
{
    int pos = input.IndexOf(sep);
    count--;
    while(pos > -1 && count > 0)
    {
        pos = input.IndexOf(sep, pos+1);
        count--;
    }
    return pos ;
}

編集:入力文字列の数値を制御できない場合(たとえば、一部のお金に1つまたは2つの値しかない場合)、入力文字列の4つのブロックで正しくサブストリングする方法はありません。正規表現に頼ることができます

List<string> result = new List<string>();

string rExp = @"[A-Z]{1,3}(\d|\s|\.)+";
// --- EUR with only two numeric values---
string inp = "USD 1.23 1.12 1.42 EUR 0.2 0.42 JPY 1.2 1.42 1.53";
Regex r = new Regex(rExp);
var m = r.Matches(inp);
foreach(Match h in m)
   result.Add(h.ToString());

このパターンは、小数点記号としてコンマを含む数字と数字を含まない通貨記号も受け入れます( "GPB USD 1,23 1,12 1.42"

string rExp = @"[A-Z]{1,3}(,|\d|\s|\.)*"; 

RegEx式言語-クイックリファレンス

于 2012-08-18T22:46:48.937 に答える
3

最も簡単な方法は、最初にすべての単語でそれをリストに分割し、次に4つの単語の各グループを再結合する小さなループを作成することです。

于 2012-08-18T22:32:31.540 に答える
1

リアクティブフレームワークの人は、の拡張機能をたくさん持っていIEnumerable<T>ます。それらの1つはBuffer、あなたが望むことをとても簡単に行うことです。

ここにあります:

var text = "USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53";
var result = text.Split(' ').Buffer(4);

そしてそれは与える:

結果

于 2012-08-19T09:26:30.587 に答える