【问题标题】:c# string indexing by every 2 elementsc#字符串索引每2个元素
【发布时间】:2023-03-19 11:19:01
【问题描述】:

我正在尝试制作一个小型解密器,但是有没有一种方法可以对数字上的字符串进行 for 循环,例如“1512120508”通过 i 索引 2 个字符而不是 0 然后 1 然后 2 等等。例如首先循环检查索引 0 和 1(“15”),然后下一个循环检查 2 和 3(“12”),依此类推。谢谢。

public string decode(string text)
        {
            string newText = "";
            string transposed = "";

            var encryption = new Dictionary<string, string>(){
                {"a","01"},{"b","02"},{"c","03"},{"d","04"},{"e","05"},
                {"f","06"},{"g","07"},{"h","08"},{"i","09"},{"j","10"},
                {"k","11"},{"l","12"},{"m","13"},{"n","14"},{"o","15"},
                {"p","16"},{"q","17"},{"r","18"},{"s","19"},{"t","20"},
                {"u","21"},{"v","22"},{"w","23"},{"x","24"},{"y","25"},
                {"z","26"}
            };

            for(int i = ; i < text.Length; i)
            {
                if(encryption.ContainsValue(Convert.ToString(text[i])))
                {
                    // finds key from value
                    var myKey = encryption.FirstOrDefault(x => x.Value == Convert.ToString(text[i])).Key;
                    transposed += myKey;
                }
            }

【问题讨论】:

  • @TimSchmelter 公平竞争的伙伴,没想到我不会撒谎,你就这样做谢谢!
  • @TimSchmelter 哦,不,它不会那样工作,因为当我使用正常的 for 循环时,它仍然索引每个字符,但值为 01 02 03 等。

标签: c# loops class oop


【解决方案1】:

是的,您可以在 for 循环中使用 +=2String.Substring。但我会使用StringBuilder 并且不要使用ContainsValue + 字典上的另一个循环,但只有一个:

public static string decode(string text, int length = 2)
{
    StringBuilder transposeBuilder = new StringBuilder();

    var encryption = new Dictionary<string, string>(){
                {"a","01"},{"b","02"},{"c","03"},{"d","04"},{"e","05"},
                {"f","06"},{"g","07"},{"h","08"},{"i","09"},{"j","10"},
                {"k","11"},{"l","12"},{"m","13"},{"n","14"},{"o","15"},
                {"p","16"},{"q","17"},{"r","18"},{"s","19"},{"t","20"},
                {"u","21"},{"v","22"},{"w","23"},{"x","24"},{"y","25"},
                {"z","26"}
            };

    for (int i = 0; i < text.Length; i += length)
    {
        string token = text.Length >= i + length ? text.Substring(i, length) : text.Substring(i);
        var keyValue = encryption.FirstOrDefault(kv => kv.Value == token);
        if(!keyValue.Equals(default(KeyValuePair<string, string>)))
        {
            transposeBuilder.Append(keyValue.Key); 
        }
    }
    
    return transposeBuilder.ToString();
}

您应该考虑将值存储在键中,并将键存储在值中以受益于字典的快速查找性能。然后你可以使用这个代码:

for (int i = 0; i < text.Length; i += length)
{
    string token = text.Length >= i + length ? text.Substring(i, length) : text.Substring(i);
    if(encryption.TryGetValue(token, out string value))
    {
        transposeBuilder.Append(value); 
    }
}

【讨论】:

  • 是的,感谢您的帮助,我刚刚交换了键值并使用了子字符串,现在再次欢呼
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 2016-12-26
  • 2018-07-30
  • 2022-10-15
  • 2018-01-02
  • 2012-07-03
  • 2022-07-21
  • 2018-01-05
相关资源
最近更新 更多