字符串按每3个字分割

时间:2015-09-18 11:03:15

标签: c# string split

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

我需要带有子字符串的数组: “经济驱动没有” “无限制地开车”

现在我有了这个:

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

4 个答案:

答案 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个字符串,请从左边填充。