昨天我问了这个问题,但收到的并不是很好,主要是因为我这么问题,所以这次尝试做得更好。
我有一个名为message的字符串变量。让我们说消息等于" ABCDABCDABCDABCD"
现在我需要对字符串中的字符进行一些处理,但不能同时对所有字符进行处理,我想在函数的第一遍中访问字符[0] [4] [8] [12],put字符串中的每个字符并返回它,如果我将一个整数传递给我的函数,这很容易就可以说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来执行此操作我传递函数但是然后id需要多次调用该函数并对返回的字符串进行处理以获取它们按照他们已经尝试过的顺序,当处理大型消息时,它减慢了程序的速度> 10k个字符。
请不要删除或暂停我的问题,我很乐意提供有关我的问题的更多信息,如果它不清楚,很少发布到这个网站,并且通常尝试自己找到解决方案,也有我喜欢这里的许多接受瘾君子。但我会感谢他们中的一些人对此有所帮助。谢谢
修改
我理解它并不容易弄清楚,我不得不说我不是最好的描述它,它是WPF中的vigenere破解者,我已经对一段文字进行了kasiski检查并绘制了所有数据,它在90%的时间内找到了密钥长度,或者给了我关键字的最佳线索,现在我根据kasiski考试的数据计算消息的双,三和四克的频率,让我们说key为5,消息为" ABCDABCDABCDABCD"我只计算密钥Im的字符的概率,所以当我尝试密钥AAAAA我只想计算消息的元素[0] [4] [9] [14]上的字母组合时,生成26个字符到ZAAAA并且最有可能然后我移动到键的元素[1],让我们说FAAAA在键的第一个元素上给出了最好的分数。现在我需要元素[0] [1],[5] [6],[9] [10] [13] [14]作为我在关键FCAAA上计算2件的概率,所以关键的长度和什么我正在研究的关键人物将确定该消息的哪些元素。
答案 0 :(得分:1)
使用LINQ的单行(我使用MoreLINQ中的批量扩展,但您可以使用自己的)从输入字符串中选择所有必需的字符:
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);
}
我还会创建从字符串的开头安全获取子字符串的方法(以避免恼人的字符串长度检查并将零作为起始索引传递):
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);
答案 1 :(得分:0)
您可以将字符串解析为char数组:
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];
}
编辑1:
public string[] myfunction(char[] charArray)
{
List<string> result = new List<string>();
for(int i=0, i<charArray.length -1; i=i+4)
{
result.add(charArray[i]+charArray[i+1])
}
return result.toArray();
}
答案 2 :(得分:0)
如果我理解正确的话,这是一个简单的程序,可以满足您的需求:
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();
}
答案 3 :(得分:0)
我的解决方案将是这样的
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();
}
答案 4 :(得分:0)
这是递归解决方案。在YourFunction中,PatternLength是重复的字符模式的长度(因此,“ABCD”为4),Offset是您在模式中开始的位置(例如,如果以“A”开头,则为0),SubstringLength是字符数
Main中的函数调用将为您提供所有“A”。如果将SubstringLength更改为2,则会为您提供所有“AB”。没有错误处理,请确保PatternLength&lt; = Offest + SubstringLength
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;
}
}
}