我遇到了问题。我需要像这样拆分我的每个字符串: 例如: “没有限制的经济驱动”
我需要带有子字符串的数组: “经济驱动没有” “无限制地开车”
现在我有了这个:
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++;
}
}
答案 0 :(得分:6)
您可以使用此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();
因为其他人评论说,因为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));
}
答案 1 :(得分:1)
我尝试提供一个简单的解决方案。所以我希望你能更好地理解它。
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);
}
方法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并获得所需的单词。
答案 2 :(得分:1)
仅为比较目的,这是另一个不使用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]));
或使用ArraySegment<string>
:
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)));
答案 3 :(得分:0)
我会使用其中一个methods described here;例如,以3为3的元素。
var groups = myStrings.Select((p, index) => new {p,index})
.GroupBy(a =>a.index/3);
警告,它不是最有效的内存,如果你开始解析大字符串,它可能会爆炸你。试着观察。
然后你只需要处理最后一个元素。如果它少于3个字符串,请从左边填充。