Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中每四个单词拆分一个字符串?_C#_.net - Fatal编程技术网

如何在c#中每四个单词拆分一个字符串?

如何在c#中每四个单词拆分一个字符串?,c#,.net,C#,.net,我正在使用C#4.0,遇到了这样一种情况:我必须将整个字符串每四个单词拆分一次,然后将其存储在列表对象中。 因此,假设我的字符串包含:“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<string> test = new List<string&

我正在使用C#4.0,遇到了这样一种情况:我必须将整个字符串每四个单词拆分一次,然后将其存储在列表对象中。 因此,假设我的字符串包含:
“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<string> test = new List<string>(data.Split(' ')); //(not working as it splits on every word)
List test=新列表(data.Split(“”))//(每一个单词都会分裂,因此不起作用)

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

使用一点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();

当然,我的答案没有linq的那么吸引人,但我想发布这个
老派的方法

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 ;
}

被动框架的家伙们为
IEnumerable
提供了一系列扩展。其中之一是
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);
这就产生了:


也可以对4个单词进行正则表达式拆分,但我可能会按照您的方式进行拆分。您是否无法控制此字符串的创建?看起来你可以把你的字符串数组循环一下,每4个就生成一个新的字符串?实际上原始字符串是从pdf文件中读取的,我对此没有控制权。这就是为什么我让top find每4个单词循环一次。所以您的字符串可能缺少某个数值?像
“1.23美元1.12欧元1.42欧元0.20.3日元1.2欧元1.42欧元1.53”(欧元只有两个值)我认为这将是一个更强大的正则表达式拆分,以防出现不一致的空白使用。我尝试过这一点,但它似乎每5个字而不是每4个字拆分一次。你能检查一下吗?@ConfusedProgrammer:对我来说很好-想想整数除法,分组就变得很明显了:0,1,2,3将在第一组中,4,5,6,7在下一组中,依此类推。嗯……但它还是给了我错误的输出。它分成5个单词。是不是因为这些单词中的数字可能会引起问题?正如@chaospanion所指出的,只有不一致的空格才会引起问题。你给出的例子很好。好的,还有一件事。可以修改正则表达式以接受带逗号的数字吗?e、 g.1625美元。87@ConfusedProgrammer回答已更新,很抱歉延迟,但这里是夜间。感谢更新的正则表达式。我需要对正则表达式做更多的研究,因为它是我的弱点:(…我是否必须导入另一个程序集,因为它无法识别缓冲区函数?您需要获得“Microsoft Interactive Extensions SDK”v1.1.10621。您可以使用NuGet查找“Ix_-Main”。它附带了一系列非常有用的扩展名—“Buffer”、“Case”、“Catch”、“Concat”、“Create”、“Defer”、“DistinctUntilChanged”、“Do”、“DoWhile”、“Expand”、“Finally”、“For”、“ForEach”、“Generate”、“Hide”、“If”、“IgnoreElements”、“IsEmpty”、“Max”、“MaxBy”、“Memoize”、“Min”、“MinBy”、“OnErrorResumeNext”、“Publish”、“Repeat”、“Retry”、“Retry”,“Return”、“Scan”、“SelectMany”、“Share”、“SkipLast”、“StartWith”、“TakeLast”、“Throw”、“Using”、“While”。
string rExp = @"[A-Z]{1,3}(,|\d|\s|\.)*"; 
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);