C# 获取某些字符串并返回该字符串

C# 获取某些字符串并返回该字符串,c#,string,C#,String,我昨天问了这个问题,但没有得到很好的回应,主要是因为我问的方式,所以这次我会努力做得更好 我有一个名为message的字符串变量。让我们假设消息等于“abcdabcdabcdabcdabcd” 现在我需要对字符串中的字符进行一些处理,但不能同时处理所有字符,我希望在函数的第一次传递时访问字符[0][4][8][12],将这些字符中的每一个放入字符串并返回,如果我向函数传递一个整数(比如4)并在for循环中使用,这很容易做到 if(i % int == 0) { string += mess

我昨天问了这个问题,但没有得到很好的回应,主要是因为我问的方式,所以这次我会努力做得更好

我有一个名为message的字符串变量。让我们假设消息等于“abcdabcdabcdabcdabcd”

现在我需要对字符串中的字符进行一些处理,但不能同时处理所有字符,我希望在函数的第一次传递时访问字符[0][4][8][12],将这些字符中的每一个放入字符串并返回,如果我向函数传递一个整数(比如4)并在for循环中使用,这很容易做到

if(i % int == 0)
{
   string += message[i];
}
这应该返回“AAAA”

下次调用函数时,我需要元素[0][1]、[4][5]、[8][9]、[12][13],之后的时间我需要元素[0][1][2]、[4][5][6]、[8][9][10]、[12][13][14]

我需要以字符串的顺序返回字符,我可以通过更改int来实现这一点,我传递了函数,但我需要调用函数多次,并对返回的字符串进行处理,以使其符合获取顺序,我已经试过了,当处理大于10k字符的大消息时,它会减慢我的程序

请不要删除或搁置我的问题,如果我的问题不清楚,我很乐意提供更多关于我问题的信息,我很少在这个网站上发帖,通常我自己会尝试找到解决方案,这里有太多的接受迷,我不喜欢。但是我会感谢他们中的一些人在这方面的帮助。谢谢

编辑


我明白这不容易理解,我不得不说我不是最擅长描述它的人,它是WPF中的维格纳饼干,我对一段文本进行了卡西斯基检查,并将所有数据用图表表示出来,它在90%的时间内找到了键的长度,或者给了我关于键可能是什么的最佳线索,现在我正在计算bi的频率,消息的三元和四元图基于kasiski考试的数据,假设密钥为5,消息为“abcdabcdabcdabcdabcd”我只计算密钥字符的概率,因此当我尝试密钥AAAA时,我只想计算消息元素[0][4][9][14]上的花押字,我将运行到ZAAAA的26个字符,取最可能的,然后我移动到键的元素[1],假设FAAAA在键的第一个元素上给出了最好的分数。现在我需要元素[0][1]、[5][6]、[9][10][13][14]作为我在计算键FCAAA上两个片段的概率,因此键的长度和我正在处理的键字符将决定消息的哪些元素。

您可以将字符串解析为字符数组:

string message="ABCDABCDABCDABCD";
char[] myCharArray = message.ToCharArray();

string result="";
for(int i=0, i<myCharArray.Length -1 ; i++)
{
   if(i%4 ==0)
      result+=myCharArray[i];
}
string message=“ABCDABCDABCDABCD”;
char[]myCharArray=message.ToCharArray();
字符串结果=”;

对于(int i=0,i这里有一个简单的程序,如果我理解正确,它可以满足您的需要:

    static void Main(string[] args)
    {
        string data = "ABCDABCDABCDABCD";

        Console.WriteLine(StrangeSubstring(data,4, 1));
        // "AAAA"
        Console.WriteLine(StrangeSubstring(data,4, 2));
        // "ABABABAB"
        Console.WriteLine(StrangeSubstring(data,4, 3));
        // "ABCABCABCABC"
    }

    static string StrangeSubstring(string input, int modulo, int length)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < input.Length; ++i)
        {
            if (i % modulo == 0)
            {
                for (int j = 0; j<length; ++j)
                {
                    if (i+j < input.Length)
                        sb.Append(input[i+j]);
                }
            }
        }
        return sb.ToString();
    }
static void Main(字符串[]args)
{
string data=“ABCDABCDABCDABCD”;
Console.WriteLine(奇怪的子字符串(数据,4,1));
//“AAAA”
Console.WriteLine(奇怪的子字符串(数据,4,2));
//“阿巴巴布”
Console.WriteLine(奇怪的子字符串(数据,4,3));
//“ABCABC”
}
静态字符串子字符串(字符串输入、整数模、整数长度)
{
StringBuilder sb=新的StringBuilder();
对于(int i=0;i对于(int j=0;j我的解将是这样的

         static string MethodName(int range){
         StringBuilder sb = new StringBuilder();
         for(int i = 0 ; i < str.Length ; i++){
          if(i % 4 == 0){
             sb.Append(str[i]);
             for(int j = i + 1 ; j <= i + range ; j ++){
               if(j >= str.Length)
                     break;             
                  sb.Append(str[j]);
          }
        }
    }
     return sb.ToString();
   }
静态字符串方法名(int范围){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
一个LINQ线性程序(我使用来自的批处理扩展,但您可以使用自己的批处理扩展),它从输入字符串中选择所有必需的字符:

string message = "ABCDABCDABCDABCD";
int size = 4;
int charsToTake = 2;
var characters = message.Batch(size).SelectMany(b => b.Take(charsToTake));
如果需要结果作为字符串,可以轻松创建一个:

var result = new String(characters.ToArray());  
// ABABABAB  

更有效的方法-创建自己的方法,该方法将按所需长度的子字符串拆分字符串:

public static IEnumerable<string> ToSubstrings(this string s, int length)
{
    int index = 0;
    while (index + length < s.Length)
    {
        yield return s.Substring(index, length);
        index += length;
    }

    if (index < s.Length)
        yield return s.Substring(index);
}
现在很清楚你在做什么:

var substrings = message.ToSubstrings(size)
                        .Select(s => s.SubstringFromStart(charsToTake));

var result = String.Concat(substrings);

这是一种递归解决方案。在函数中,PatternLength是重复的字符模式的长度(因此,4表示“ABCD”),Offset是模式中开始的位置(例如,如果以“a”开头,则为0),SubstringLength是字符数


Main中的函数调用将给您所有的“A”。如果您将SubstringLength更改为2,它将给您所有的“AB”。没有错误处理,请确保then PatternLength如果您发布实际代码(理想情况下是一个简短但完整的程序演示该问题),它确实有帮助而不是伪代码。除此之外,它使发布“更正”版本更容易。还不清楚您如何期望得到(0,1),(4,5)等循环。最后,还不清楚您是否有运行缓慢的代码,或者您是否仍在尝试运行正常的代码。(无论哪种方式,我建议使用StringBuilder…)这如何解决OP的问题?在代码示例中,字符串已被视为字符数组。他可以访问数组中的所有字符并执行其他功能…我将编辑我的帖子,请稍候:-d将看不到字符数组的值。
(inti=0;i
也会做同样的事情,我想。这个解决方案满足了我的需要,现在这个问题似乎很简单,等到模数为0,将所有字符的长度增加到所需的长度并附加到字符串中,非常感谢,我尝试了发布的其他一些解决方案,但它们没有给出我需要的结果,这很简单,对于较小的t来说似乎足够快现在可以了,谢谢。
public static string SubstringFromStart(this string s, int length)
{
    return s.Substring(0, Math.Min(s.Length, length));
}
var substrings = message.ToSubstrings(size)
                        .Select(s => s.SubstringFromStart(charsToTake));

var result = String.Concat(substrings);
    namespace Foo
{
    class Bar
    {
        static void Main(string[] args)
        {
            Console.WriteLine(YourFunction("ABCABCABCABCABCABCABC", 3, 0,1));
            Console.ReadKey();
        }


        static string YourFunction(string SubString, int PatternLength, int Offset, int SubstringLength)
        {
            string result;
            if (SubString.Length <= PatternLength)
            {
                result = SubString.Substring(Offset, SubstringLength);
            }
            else
            {
                result = YourFunction(SubString.Substring(PatternLength, (SubString.Length - PatternLength)), PatternLength, Offset, SubstringLength) + SubString.Substring(Offset, SubstringLength);
            }
            return result;
        }
    }
}