簡體   English   中英

用雙引號替換引號

[英]Replacing quotes with double quotes

我需要使用函數將字符串中的所有引號替換為雙引號,但是我不知道如何返回替換后的字符串版本。 我是C#的新手,因此將不勝感激。

這是我的代碼

    private void ReplaceAllQuotes(string Name, string Contact, string    CallType, 
                                  string Reason, string Notes, string State, 
                                  string Consultant, string CustNo, string Time, 
                                  string SubReason, string AddedBy, string AddedOn, 
                                  string UpdatedBy, string UpdatedOn)
    {
        Name = Name.Replace("'", "\"");
        Contact = Contact.Replace("'", "\"");
        CallType = CallType.Replace("'", "\"");
        Reason = Reason.Replace("'", "\"");
        Notes = Notes.Replace("'", "\"");
        State = State.Replace("'", "\"");
        Consultant = Consultant.Replace("'", "\"");
        CustNo = CustNo.Replace("'", "\"");
        Time = Time.Replace("'", "\"");
        SubReason = SubReason.Replace("'", "\"");
        AddedBy = AddedBy.Replace("'", "\"");
        AddedOn = AddedOn.Replace("'", "\"");
        UpdatedBy = UpdatedBy.Replace("'", "\"");
        UpdatedOn = UpdatedOn.Replace("'", "\"");
    }

注意到您所做的所有copypasta嗎? 每次您按ctrl-v

.Replace("'", "\"");

您應該感到壓倒性的內sense感。 如果沒有,您將永遠不會成為真正的程序員。

一個真正的程序員只會做一次事情,因為我們很懶。

public string YerSingleQuotesSuck(string incorrectString)
{
    if(string.IsNullOrWhiteSpace(incorrectString)
        return ""; // or throw, or do whatever
    return incorrectString.Replace("'", "\"");
}

現在,您可以輕松修復錯誤

something.Name = YerSingleQuotesSuck(something.Name);
something.Contact = YerSingleQuotesSuck(something.Contact);

這里要記住一些事情-方法封裝了可以多次使用的邏輯,從而使您不必在任何地方復制粘貼該邏輯。

另外,字符串是不可變的 ,這意味着您無法更改它們。 字符串方法始終采用一個字符串並將其轉換為另一個字符串 您需要用轉換后的字符串替換第一個字符串。

在這種情況下,對您問題的其他解決方案(例如使用ref關鍵字)並不是最佳選擇。 方法簽名短時長於長。

最后,通過C#獲取CLR,跳過前兩章,然后閱讀。

我假設您要在特定上下文中替換所有這些字符串。 不要像那樣一起做所有的事。 制作一個更簡單,更通用的方法,並多次使用該方法:

private string ReplaceAllQuotes(string anyWhichEverString){
    return anyWhichEverString.Replace("'", "\"");
}

編輯后將返回每個更新字符串。

您確實可以使用擴展方法將替換集中在一個位置,但是由於您的問題是對函數內部的局部參數變量的更改繼續存在,因此可以將"ref"關鍵字添加到每個參數變量中,因此您在函數內部所做的更改將反映在函數調用程序中。

由於參數太多,建議您創建一個包含所有這些字段的類,例如

public class MyObject

{
    public string Name;
    public string Contact;

}

然后讓您的函數接收對該對象的引用,例如

private void ReplaceAllQuotes(MyObject obj)
{
   ...
}

這樣,在函數內對obj所做的任何更改都會保留下來,因為“ obj”是“引用類型”變量,也就是說,它保存的是引用,而不是對象應該保留的實際數據值。 它指向內存中分配了所有MyObjects字段空間的位置。 因此,對obj.Name等的任何更改都將保留,因為對您剛剛傳遞到方法中的MyObject實例的所有其他引用-它們全部(除非您有意更改了它們)都指向相同的內存地址。

正如其他人提到的,出於以下幾個原因,我首先建議創建一個類來封裝您的所有參數:

  1. 調用方法時弄亂參數的順序
  2. 能夠添加值而無需更改方法的接口

調用該方法后無法使用更新后的值的原因與上下文有關。 其他人提供了有關處理此問題的詳細信息,但我建議您采用一種不同的方法來使其更容易理解:從您的方法中返回類的新實例。

處理替換引號的擴展方法:

public static class Extensions
{
    public static string ReplaceQuotes(this string value)
    {
        return value.Replace("'", "\"");
    }
}

封裝在類中的值的簡化版本:

public class Record
{
    public string Name { get; set; }

    public string Contact { get; set; }

    //...
    public Record(string name, string contact)
    {
        this.Name = name;
        this.Contact = contact;
    }

    public Record(Record r)
    {
        this.Name = r.Name.ReplaceQuotes();
        this.Contact = r.Contact.ReplaceQuotes();
    }
}

然后,最后,您更新記錄的方法:

private Record ReplaceAllQuotes(Record r)
{
    return new Record(r));
}

這樣,當您從ReplaceAllQuotes()返回時,所有引號都是正確的,並且您不必擔心參數類型,盡管如果您打算繼續使用C#(或任何其他C),當然也需要熟悉這些內容。 -家庭語言,基本上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM