Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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# 在第16个字符上将字符串拆分为数组_C#_Arrays_String_Split - Fatal编程技术网

C# 在第16个字符上将字符串拆分为数组

C# 在第16个字符上将字符串拆分为数组,c#,arrays,string,split,C#,Arrays,String,Split,我有一个文本文件,其中包含各种16个字符的字符串,它们彼此附加在一起,并且在单独的行上。我已经做到了 FileInfo f = new FileInfo("d:\\test.txt"); string FilePath = ("d:\\test.txt"); string FileText = new System.IO.StreamReader(FilePath).ReadToEnd().Replace("\r\n", ""); CharCount = FileText.Length; 删除

我有一个文本文件,其中包含各种16个字符的字符串,它们彼此附加在一起,并且在单独的行上。我已经做到了

FileInfo f = new FileInfo("d:\\test.txt");
string FilePath = ("d:\\test.txt");
string FileText = new System.IO.StreamReader(FilePath).ReadToEnd().Replace("\r\n", "");
CharCount = FileText.Length;
删除所有新行并创建一个大量追加的字符串。我现在需要将这个巨大的字符串拆分成一个数组。我需要在连续的第16个字符上拆分它,直到结束。有人能给我指引正确的方向吗?我已经研究了字符串中的各种方法,例如
Split
StreamReader
中的方法,但是我不知道最好的方法是什么。我相信这很简单,但我搞不懂


谢谢。

创建一个列表来存放您的代币。然后获取长度为16的后续子字符串,并将它们添加到列表中

List<string> tokens = new List<string>();
for(int i=0; i+16<=FileText.Length; i+=16) {
    tokens.Add(FileText.Substring(i,16));
}
List tokens=newlist();
对于(int i=0;i+16,调整以下答案:

你可以试着这样做:

        string longstr = "thisisaverylongstringveryveryveryveryverythisisaverylongstringveryveryveryveryvery";
        IEnumerable<string> splitString = Regex.Split(longstr, "(.{16})").Where(s => s != String.Empty);
        foreach (string str in splitString)
        {
            System.Console.WriteLine(str);
        }

请试试这个方法。我没有试过,但用过一次

    int CharCount = FileText.Length;
    int arrayhold = (CharCount/16)+2;
    int count=0;
    string[] array = new string[arrayhold];
    for(int i=0; i<FileText.Length; i+=16)
       {
          int currentleft = FileText.Length-(16*count);
          if(currentleft>16)
            {
                  array[count]=FileText.Substring(i,16);
            }
          if(currentleft<16)
            {
                  array[count]=FileText.Substring(i,currentleft);
            }

              count++;
        }
int CharCount=FileText.Length;
int-arrayhold=(CharCount/16)+2;
整数计数=0;
字符串[]数组=新字符串[arrayhold];
对于(int i=0;i16)
{
array[count]=FileText.Substring(i,16);
}
如果(currentleft尝试此选项:

var testArray = "sdfsdfjshdfalkjsdfhalsdkfjhalsdkfjhasldkjfhasldkfjhasdflkjhasdlfkjhasdlfkjhasdlfkjhasldfkjhalsjfdkhklahjsf";
var i = 0;
var query = from s in testArray
            let num = i++
            group s by num / 16 into g
            select new {Value = new string(g.ToArray())};

var result = query.Select(x => x.Value).ToList();

结果是包含所有16个字符字符串的列表。

一个可能的解决方案可能如下所示(提取为扩展方法,并使其成为动态的,以防需要不同的令牌大小,并且没有硬编码的依赖项):

输出为:

1234567890ABCDEF
1234567890ABCDEF
1234567890ABCDEF
1234567890
不同令牌大小的用法:

以及相应的输出:

1234567890ABC
DEF1234567890
ABCDEF1234567
890ABCDEF1234
567890

这不是一个花哨的解决方案(很可能会优化速度),但它可以工作,而且很容易理解和实现。

所以您只想删除换行符?@Herblore因此文件中的每行都有16个字符?如果字符串长度不是16的倍数,则将失败。@UlugbekUmirov:感谢您的发现。现在应该可以工作了。如果长度小于16,我们不应该忽略最后一部分。您可以使用
Math.Min(16,FileText.Length-i)
作为长度参数。@UlugbekUmirov是的,看到我的答案了吗-1原因是剩下的字符怎么办?@SriramSakthivel现在可以工作了,通过添加正确的方法来处理剩余字符来证明。感谢ideone。@所有的反对者,请看这个并修复反对者,现在可以工作了!:(最好是,为什么是-1?答案有什么问题?
public static class ProjectExtensions
{
    public static String[] Chunkify(this String input, int chunkSize = 16)
    {
        // result
        var output = new List<String>();
        // temp helper
        var chunk = String.Empty;
        long counter = 0;
        // tokenize to 16 chars
        input.ToCharArray().ToList().ForEach(ch => 
        {
            counter++;
            chunk += ch;
            if ((counter % chunkSize) == 0)
            {
                output.Add(chunk);
                chunk = String.Empty;
            }
        });
        // add the rest
        output.Add(chunk);

        return output.ToArray();
    }
}
// 3 inputs x 16 characters and 1 x 10 characters
var input = @"1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890";
foreach (var chunk in input.Chunkify())
{
    Console.WriteLine(chunk);
}
1234567890ABCDEF
1234567890ABCDEF
1234567890ABCDEF
1234567890
foreach (var chunk in input.Chunkify(13))
{
    Console.WriteLine(chunk);
}
1234567890ABC
DEF1234567890
ABCDEF1234567
890ABCDEF1234
567890