Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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# 每3个单词拆分一个字符串_C#_String_Split - Fatal编程技术网

C# 每3个单词拆分一个字符串

C# 每3个单词拆分一个字符串,c#,string,split,C#,String,Split,我有个问题。我需要像这样拆分每条字符串: 例如: “无限制的经济驱动” 我需要这样的子字符串数组: “没有经济驱动力” “无限制驾驶” 现在我有这个: List<string> myStrings = new List<string>(); foreach(var text in INPUT_TEXT) //here is Economic drive without restrictions {

我有个问题。我需要像这样拆分每条字符串: 例如: “无限制的经济驱动”

我需要这样的子字符串数组: “没有经济驱动力” “无限制驾驶”

现在我有这个:

            List<string> myStrings = new List<string>();
        foreach(var text in INPUT_TEXT) //here is Economic drive without restrictions
        {
            myStrings.DefaultIfEmpty();
            var textSplitted = text.Split(new char[] { ' ' });
            int j = 0;
            foreach(var textSplit in textSplitted)
            {

                int i = 0 + j;
                string threeWords = "";
                while(i != 3 + j)
                {
                    if (i >= textSplitted.Count()) break;
                    threeWords = threeWords + " " + textSplitted[i];
                    i++;
                }
                myStrings.Add(threeWords);
                j++;
            }
        }
List myStrings=new List();
foreach(INPUT_text中的var text)//这里是没有限制的经济驱动
{
myStrings.DefaultIfEmpty();
var textplitted=text.Split(新字符[]{''});
int j=0;
foreach(textSplitted中的var textsplitt)
{
int i=0+j;
字符串三个字=”;
而(i!=3+j)
{
如果(i>=textSplitted.Count())中断;
三个字=三个字+“”+文本拆分[i];
i++;
}
myStrings.Add(三个单词);
j++;
}
}

您可以使用此LINQ查询:

string text = "Economic drive without restrictions";
string[] words = text.Split();
List<string> myStrings = words
    .Where((word, index) => index + 3 <= words.Length)
    .Select((word, index) => String.Join(" ", words.Skip(index).Take(3)))
    .ToList();
string text=“经济驱动无限制”;
string[]words=text.Split();
列出myStrings=words
.Where((word,index)=>index+3 String.Join(“,words.Skip(index.Take)(3)))
.ToList();
因为其他人评论说最好显示一个循环版本,因为OP正在学习这种语言,所以这里有一个完全不使用LINQ的版本:

List<string> myStrings = new List<string>();
for (int index = 0; index + 3 <= words.Length; index++)
{ 
    string[] slice = new string[3];
    Array.Copy(words, index, slice, 0, 3);
    myStrings.Add(String.Join(" ", slice));
}
List myStrings=new List();
对于(int index=0;index+3,我将使用其中一个;例如,下面采用3乘3的元素

var groups = myStrings.Select((p, index) => new {p,index})
                      .GroupBy(a =>a.index/3);
警告,这不是最有效的内存使用方法,如果您开始解析大字符串,它可能会对您造成影响。请尝试观察


然后您只需要处理最后一个元素。如果它少于3个字符串,请从左侧填充。

我尝试给出一个简单的解决方案。因此,我希望您能更好地理解它

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

    string input = "Economic drive without restrictions";

    var allWords = input.Split(new char[] {' '});

    for (int i = 0; i < allWords.Length - 2; i++)
    {
        var textSplitted = allWords.Skip(i).Take(3);
        string threeString = string.Join(" ", textSplitted);
        myStrings.Add(threeString);
    }

    foreach (var myString in myStrings)
    {
        Console.WriteLine(myString);
    }
List myStrings=new List();
字符串输入=“无限制的经济驱动”;
var allWords=input.Split(新字符[]{''});
for(int i=0;i
方法
Take(n)
来自Linq。它获取给定数组的第一个
n
元素。例如,如果你有一个数组
a,b,c,d,e
,那么
Take(3)
将给你一个新数组
a,b,c

方法
Skip(n)
来自Linq。它通过首先跳过
n
元素来提供新数组。给定数组
a、b、c、d、e
,然后
Skip(1)
将返回
b、c、d、e
。如您所见,它跳过了第一个元素


现在,使用这两种方法,您可以按3乘3的顺序在数组上移动,并获得所需的单词。

仅出于比较目的,下面是另一种不使用Linq的解决方案:

string[] words = INPUT_TEXT.Split();
List<string> myStrings = new List<string>();

for (int i = 0; i < words.Length - 2; ++i)
    myStrings.Add(string.Join(" ", words[i], words[i+1], words[i+2]));
string[]words=INPUT_TEXT.Split();
List myStrings=new List();
for(int i=0;i
或者使用
数组整理

string[]words=INPUT_TEXT.Split();
List myStrings=new List();
for(int i=0;i
你需要在每个循环的j中添加3个。你还需要检查textsplitted的结尾小挑剔:
Skip
Take
不要给你数组,它们使用的是延迟执行,所以基本上它们只给你查询。你需要在
foreac中执行它,例如使用
ToArray
ToList
h
或隐藏在
字符串中。Join
@TimSchmelter谢谢你告诉我这一点。是的,这不是一个数组。但这里不需要将它们转换为数组,因为这种方法和Join方法与IEnumerableI一起工作。我想知道为什么人们总是对这样的问题提出linq查询。我认为这些人只是在学习pro编程,那么复制和粘贴一个他们不理解的linq查询,然后仍在努力进行基本操作有什么好处呢。@Bgl86:这是主观的,但imo linq比“基本操作”更容易理解比如显式循环。那么为什么不学习如何使用LINQ编写可读和可维护的代码呢?将OP的方法与这个简洁的查询进行比较。我知道LINQ。但我认为在学习编程时,理解循环和条件等基础知识是必不可少的。那么OP如何在没有LINQ的情况下用Javascript解决相同的任务呢?@MatthewWatson:point take,编辑我的答案以提供一个非linq版本。@Bgl86:point take,编辑我的答案以提供一个非linq版本。但是,它不是javascript,任务不是避免所有的.NET方法。++code>params[]
string.Join的重载和
ArraySegment
string[] words = INPUT_TEXT.Split();
List<string> myStrings = new List<string>();

for (int i = 0; i < words.Length - 2; ++i)
    myStrings.Add(string.Join(" ", new ArraySegment<string>(words, i, 3)));