欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#自定義字符串替換Replace方法實例

 更新時間:2014年11月13日 16:49:22   投稿:shichen2014  
這篇文章主要介紹了C#自定義字符串替換Replace方法,以兩個不同實例對比分析了C#自定義字符串替換Replace的方法,是C#關(guān)于字符串操作的典型應(yīng)用,需要的朋友可以參考下

本文實例講述了C#自定義字符串替換Replace方法。分享給大家供大家參考。具體實現(xiàn)方法如下:

一、問題:

前一陣遇到一個如標題的算法題,是將原有字符串的某些片段替換成指定的新字符串片段,例如將源字符串:abcdeabcdfbcdefg中的cde替換成12345,得到結(jié)果字符串:ab12345abcdfb12345fg,即:abcdeabcdfbcdefg -> ab12345abcdfb12345fg。

二、實現(xiàn)方法:

顯然不能用string.Replace方法,需要自定義一個方法 string Replace(string originalString, string strToBeReplaced, string strToReplace),下面是我的實現(xiàn)代碼,在半個小時內(nèi)完成,通過了調(diào)試和常規(guī)數(shù)據(jù)的測試驗證,還算是及格吧。

復(fù)制代碼 代碼如下:

public static string Replace(string originalString, string strToBeReplaced, string strToReplace)
{
    string resultString = null;
    char[] originalCharArray = originalString.ToCharArray();
    char[] strToBeCharArray = strToBeReplaced.ToCharArray();
    char[] strToCharArray = strToReplace.ToCharArray();
    List<Char> newCharList = new List<Char>();

    for (int i = 0; i < originalCharArray.Count(); i++)
    {
 if (originalCharArray[i] == strToBeCharArray[0])
 {
     bool IsReplace = false;
     for (int j = 0; j < strToBeCharArray.Count(); j++)
     {
  if (((i + j) < originalCharArray.Count())
      && (originalCharArray[i + j] == strToBeCharArray[j]))
  {
      IsReplace = true;
  }
  else
  {
      IsReplace = false;
      break;
  }
     }
     if (IsReplace)
     {
  i += strToBeCharArray.Count() - 1;
  for (int k = 0; k < strToCharArray.Count(); k++)
  {
      newCharList.Add(strToCharArray[k]);
  }
     }
     else
     {
  newCharList.Add(originalCharArray[i]);
     }
 }
 else
 {
     newCharList.Add(originalCharArray[i]);
 }
    }

    resultString = string.Join("", newCharList);
    return resultString;
}

因為有時間限制的要求,我沒有添加注釋,不過代碼量不算多,邏輯也算簡單清晰,沒有注釋也OK啦,缺點是算法復(fù)雜度比較高。下面經(jīng)過本人同意,轉(zhuǎn)載一下同事Hello Kitty同學(xué)對同一問題的實現(xiàn)代碼, 也換一種思路來解決同一個問題。代碼稍多,也添加了一些附加功能,各種注釋也很完備,當(dāng)然也需要花費更多時間。歡迎大家有興趣一同討論此話題! PS:就在剛才還發(fā)現(xiàn)了下面代碼的一個bug,就當(dāng)是隱藏彩蛋了!

復(fù)制代碼 代碼如下:

public class Replace
{
        /// <summary>
        /// Replace 方法
        /// </summary>
        /// <param name="source">原字符串</param>
        /// <param name="find">需要查找的字符串</param>
        /// <param name="replace">替換的字符串</param>
        /// <returns>最終替換成功的字符串</returns>
        public string Replace(string source, string find, string replace)
        {
            // 要查找的字符串大于原來字符串,則不處理,返回原來字符
            if (find.Length > source.Length)
            {
                return source;
            }

            // 記錄找到多少次
            int findCount = 0;
            // 僅用于標記,輔助記錄多少次
            bool flag = true;
            // n:source字符串遍歷的數(shù)值;j:find字符串遍歷的數(shù)值
            int n = 0, j = 0;
            // s:查找到字符串的開始索引,e:查找到字符串的結(jié)束索引
            int s = 0, e = 0;

            while (true)
            {
                // 判斷字符是否相等
                if (source[n] == find[j])
                {
                    // Source 序列+1
                    n++;
                    // 判斷是否為第一位相匹配
                    if (j == 0)
                    {
                        // 賦值給s,查找到頭的索引
                        s = n;
                    }
                    // 查找到后下一次比較find的下一位
                    j++;
                    // 標記暫時找到前面相同的字符
                    flag = true;
                }
                else
                {
                    // 記錄不完全匹配
                    flag = false;
                    // find的索引歸零
                    j = 0;
                    // Source的索引繼續(xù)想加
                    n++;
                }

                // 已經(jīng)查找完畢
                if (j == find.Length)
                {
                    // 完全匹配
                    if (flag)
                    {
                        // 查找的字符數(shù)量+1
                        findCount++;
                    }
                    // 記錄查找的數(shù)組結(jié)尾索引
                    e = n;
                    // source 索引繼續(xù)+1
                    n++;
                    // find的索引歸零
                    j = 0;
                    // 計算生成新字符串,之后繼續(xù)循環(huán),直到替換所有字符串
                    source = GetNewString(source, find, replace, s, e);
                }
                // Source遍歷完畢,則退出循環(huán)
                if (n >= source.Length)
                {
                    break;
                }
            }
            // 最終字符串
            return source;
        }

        /// <summary>
        /// 獲得新的字符串
        /// </summary>
        /// <param name="source">源字符串</param>
        /// <param name="find">需要查找的字符</param>
        /// <param name="replace">需要替換的字符</param>
        /// <param name="startIndex">查找到的字符開始索引</param>
        /// <param name="endIndex">查找到的字符結(jié)束索引</param>
        /// <returns>返回替換后的字符串</returns>
        public string GetNewString(string source, string find, string replace, int startIndex, int endIndex)
        {
            // 新字符串的長度
            int newArrayLength = source.Length + endIndex - startIndex;
            // 新字符數(shù)組
            char[] newStringArray = new char[newArrayLength];
            // 將前半部分復(fù)制給新字符串
            for (int i = 0; i < startIndex - 1; i++)
            {
                newStringArray[i] = source[i];
            }
            // 當(dāng)前臨時開始索引
            int tempCurrentStartLength = startIndex - 1;
            // 將需要替換的賦值給新的字符數(shù)組
            for (int i = tempCurrentStartLength; i < tempCurrentStartLength + replace.Length; i++)
            {
                newStringArray[i] = replace[i - tempCurrentStartLength];
            }
            // 將之后剩余的字符賦值給新的數(shù)組
            for (int i = endIndex + 1; i < newArrayLength; i++)
            {
                newStringArray[i] = source[i - 1];
            }
            // 返回轉(zhuǎn)換后的字符串
            return string.Concat(newStringArray);
        }
}

希望本文所述對大家的C#程序設(shè)計有所幫助。

相關(guān)文章

  • 在C#里面給PPT文檔添加注釋的實現(xiàn)代碼

    在C#里面給PPT文檔添加注釋的實現(xiàn)代碼

    平常開會或者做總結(jié)報告的時候我們通常都會用到PowerPoint演示文稿,我們可以在單個幻燈片或者全部幻燈片里面添加注釋,這樣觀眾可以從注釋內(nèi)容里面獲取更多的相關(guān)信息,需要的朋友可以參考下
    2017-01-01
  • c#使用wmi查詢usb設(shè)備信息示例

    c#使用wmi查詢usb設(shè)備信息示例

    這篇文章主要介紹了c#使用wmi查詢usb設(shè)備信息示例,大家參考使用吧
    2014-01-01
  • C#中string.Empty和null的區(qū)別詳解

    C#中string.Empty和null的區(qū)別詳解

    這篇文章主要介紹了C#中string.Empty和null的區(qū)別詳解,本文同時講解了空字符串和Empty的區(qū)別以及string.Empty與null的區(qū)別,需要的朋友可以參考下
    2015-06-06
  • 簡單的excel導(dǎo)入導(dǎo)出示例分享

    簡單的excel導(dǎo)入導(dǎo)出示例分享

    這篇文章主要介紹了簡單的excel導(dǎo)入導(dǎo)出示例分享,需要的朋友可以參考下
    2014-03-03
  • 詳解C# 線程的掛起與喚醒

    詳解C# 線程的掛起與喚醒

    這篇文章主要介紹了詳解C# 線程的掛起與喚醒,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-05-05
  • C# SkinEngine控件 給窗體添加皮膚的方法

    C# SkinEngine控件 給窗體添加皮膚的方法

    我在網(wǎng)上搜索過,給窗體使用皮膚的方法有很多,不過C#中這種方法最簡單。利用 IrisSkin2.dll 所提供的控件 SkinEngine 來為窗體添加皮膚。
    2013-04-04
  • C#生成注冊碼的實例代碼

    C#生成注冊碼的實例代碼

    C#生成注冊碼的實例代碼,下面是一個小例子,需要的朋友可以參考一下
    2013-03-03
  • C#自定義緩存封裝類實例

    C#自定義緩存封裝類實例

    這篇文章主要介紹了C#自定義緩存封裝類,涉及C#針對緩存的寫入、讀取及設(shè)置過期時間等常用操作,并封裝進一個類中便于調(diào)用,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C#單例模式(Singleton Pattern)詳解

    C#單例模式(Singleton Pattern)詳解

    這篇文章主要為大家詳細介紹了C#單例模式Singleton Pattern的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C#實現(xiàn)JWT無狀態(tài)驗證的實戰(zhàn)應(yīng)用解析

    C#實現(xiàn)JWT無狀態(tài)驗證的實戰(zhàn)應(yīng)用解析

    這篇文章主要介紹了C#實現(xiàn)JWT無狀態(tài)驗證的實戰(zhàn)應(yīng)用解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論