用双引号替换引号

时间:2015-07-16 13:39:30

标签: c#

我需要将字符串中的所有引号替换为使用函数双引号,但我不知道如何返回字符串的替换版本。我是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("'", "\"");
    }

4 个答案:

答案 0 :(得分:3)

注意你做的所有copypasta?每次你ctrl-v'd

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

你应该感受到压倒性的内疚感。如果没有,你将永远不会成为一名真正的程序员。

true 程序员只做一次事,因为我们很懒。

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,跳过前两章,然后阅读。

答案 1 :(得分:1)

我假设您要在特定上下文中替换所有这些字符串。不要那样做所有这些;制作一个更简单,更通用的方法,并多次使用它:

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

这将在编辑后返回每个更新字符串。

答案 2 :(得分:1)

您确实可以使用扩展方法将替换集中在一个位置,但由于您的问题是对函数内部的本地参数变量进行了更改,因此您可以将"ref"关键字添加到每个位置。您的参数变量,因此您在函数内所做的更改将反映在函数调用者中。

由于你有这么多参数,我建议你创建一个包含所有这些字段的类,比如

public class MyObject

{
    public string Name;
    public string Contact;

}

然后让您的函数接收对此对象的引用,例如

private void ReplaceAllQuotes(MyObject obj)
{
   ...
}
这样,你的obj在函数内部的任何变化都会持续存在,因为" obj"是引用类型变量,意思是,它包含引用而不是您的对象应保留的实际数据值。它指向内存中的某个位置,其中分配了所有MyObjects字段的空间。因此,对obj.Name等的任何更改都将保持不变,因为您刚刚传递给该方法的MyObject实例的所有其他引用 - 它们全部(除非您在intent上更改它们)指向相同的内存地址。

答案 3 :(得分:1)

正如其他人所提到的,我首先建议创建一个类来封装所有参数,原因如下:

  1. 在调用方法时弄乱参数的顺序
  2. 无需更改方法界面即可添加值
  3. 调用方法后,您无法使用更新后的值的原因与上下文有关。其他人提供了有关处理的详细信息,但我建议采用不同的方法使其更易于理解:从您的方法返回类的新实例。

    处理替换引号的extension方法:

    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系列语言,基本上)。