接受某些字符串字符并返回该字符串
本文关键字:字符串 返回 字符 | 更新日期: 2023-09-27 18:06:30
我昨天问了这个问题,但没有得到很好的回应,主要是因为我的提问方式,所以这次我会尽量做得更好。
我有一个名为message的字符串变量。比如message = "ABCDABCDABCDABCD"
现在我需要对字符串中的字符进行一些处理但不是同时对所有字符进行处理,我想在函数的第一次传递中访问字符[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 vigenere饼干,我做过kasiski考试在一段文字和画出所有的数据,它发现密钥长度90%的时间和给我最好的线索的关键是什么,现在我计算的频率bi,消息的三,四克kasiski考试的数据基础上,假设键是5,消息是"abcdabcdcdcdcdcdcd",我只计算键字符的概率,所以当我尝试键AAAAA时,我只想计算消息中元素[0][4][9][14]上的字母组合,我将运行26个字符直到ZAAAA并取最可能的,然后我移动到键的元素[1],假设FAAAA在键的第一个元素上给出了最好的分数。现在我需要元素[0][1],[5][6],[9][10][13][14],因为我在计算键FCAAA上的2个片段的概率,所以键的长度和我正在处理的键字符将决定消息的哪些元素将被获取。
使用LINQ的一行代码(我使用MoreLINQ的批处理扩展,但您可以使用自己的扩展),从输入字符串中选择所有必需的字符:
string message = "ABCDABCDABCDABCD";
int size = 4;
int charsToTake = 2;
var characters = message.Batch(size).SelectMany(b => b.Take(charsToTake));
如果您需要result作为字符串,您可以轻松地创建一个:
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);
}
我还将创建一种方法,用于从字符串的开始安全地获取子字符串(以避免恼人的字符串长度检查和传递0作为开始索引):
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);
下面是一个简单的程序,如果我理解正确的话,它可以做你想做的事情:
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 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();
}
您可以将字符串解析为字符数组:
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];
}
EDIT:
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();
}
这是一个递归解。在YourFunction中,PatternLength是重复的字符模式的长度(因此,"ABCD"为4),Offset是您在模式中开始的位置(例如,如果您以"A"开始,则为0),SubstringLength是字符数。
Main中的函数调用将给你所有的"A"。如果你改变SubstringLength为2,它会给你所有的"AB"。没有错误处理,请确保PatternLength<= offset +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;
}
}
}