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