文字列内の[トークン]でサブストリングのすべてocurrencesを見つけ、int配列に配置します

ジョアン・ゴメス:

私は、文字列内の[]内の単一のサブストリングを交換するための作業コードを持っています。これは、文字列に「[1]」のために働いていました:

private string returnWithLinks(string adminString, int adminId)
    {
        var returnString = "Nothing at all";

        int pFrom = adminString.IndexOf("[") + "[".Length;
        int pTo = adminString.LastIndexOf("]");

        var getSourceId = adminString.Substring(pFrom, pTo - pFrom);

        int i = 0;
        bool tryParse = int.TryParse(getSourceId, out i);
        if(!tryParse) {returnString = "this is not an int!";} else {
            if(i == 1) {
                returnString = adminString.Replace("[1]", "<a>something</a>" + var1fromsomwhere + i);
            } else if (i == 2) {
                returnString = adminString.Replace("[2]", "<a>other something</a>" + var2fromsomwhere + i);
            } else if (i == 3) {
                returnString = adminString.Replace("[3]", "<a>other something</a>" + var3fromsomwhere + i);
            } else if (i == 4) {
                returnString = adminString.Replace("[4]", "<a>other something</a>" + var4fromsomwhere + i);
            } else if (i == 5) {
                returnString = adminString.Replace("[5]", "<a>other something</a>" + var5fromsomwhere + i);
            }
        }
        return returnString;
    }

しかし、私は今のようなトークンのすべての出現箇所を交換できるようにする必要があります。

adminString = "[1][2]somthingelse[2]another[4]aa";

私は、もし節でそれぞれint型のループ、int配列にトークン内のすべてのint型を置くことを考えましたが、配列を作成することはcompletlyアウト私のleageのです。

私はこれをどのように達成することができますか?

配列をした後、私は、if節とそれをループます。

ジョナサン・アルファロ:

あなたは、配列、あるいはループを必要としません。

これを行うには...例えば、辞書を使用して、多くの方法があります。

しかし、あなたのケースで物事を複雑にする必要はありません。

単一のコード行は、このようなすべてのものに置き換えられます。

    private string returnWithLinks(string adminString, int adminId)
    {
            var returnString = adminString
               .Replace("[1]", "<a>something</a>" + var1fromsomwhere + 1)
               .Replace("[2]", "<a>something</a>" + var2fromsomwhere + 2)
               .Replace("[3]", "<a>something</a>" + var3fromsomwhere + 3)
               .Replace("[4]", "<a>something</a>" + var4fromsomwhere + 4)
               .Replace("[5]", "<a>something</a>" + var5fromsomwhere + 5);

            return returnString;
    }

辞書とループを行います:

    private static readonly Dictionary<string, string> _replacements = new 
    Dictionary<string, string>
    {
        { "[1]", "<a>something</a>" + var1fromsomwhere + 1 },
        { "[2]", "<a>something</a>" + var2fromsomwhere + 2 },
        { "[3]", "<a>something</a>" + var3fromsomwhere + 3 },
        { "[4]", "<a>something</a>" + var4fromsomwhere + 4 },
        { "[5]", "<a>something</a>" + var5fromsomwhere + 5 },            
    };
    private string returnWithLinks(string adminString, int adminId)
    {
            var keys = _replacements.Keys.ToArray();
            var returnString = adminString;

            for(var i = 0; i < keys.Length; i++)
            {
                var key = keys[0];

                returnString = returnString.Replace(key, _replacements[key]);
            }

            return returnString;
    }

あなたが見ることができるように辞書には、クリーナーが、コードの行の維持及び数の点ではまったく同じものであるようです。

あなたはまだ、すべての交換のための辞書に行を追加する必要があります。

辞書がハードコードされていない場合、私は辞書でループでそれを行うだろう唯一の理由は次のようになります。

辞書は、例えば、データベースからの値で満たされている場合を意味します。

ループのもう一つの欠点は、文字列の割り当て反復ごとに1つの余分割当量です。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=406308&siteId=1