3

我正在使用 C# 4.0 并且遇到了一种情况,我必须将整个字符串按每四个单词拆分并将其存储在 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|\.)*"; 

正则表达式语言 - 快速参考

于 2012-08-18T22:46:48.937 回答
3

最简单的方法是首先将每个单词拆分成一个列表,然后编写一个小循环重新组合每组四个单词。

于 2012-08-18T22:32:31.540 回答
1

反应式框架的家伙有一堆扩展IEnumerable<T>。其中之一就是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 回答