0

我知道在C#中「多替換」的想法並不是什麼新概念,這裏有很多解決方案。但是,我還沒有遇到任何優雅的解決方案,與Linq to Sql很好地交流。我的建議是創建一個擴展方法(稱爲,你猜對了,MultiReplace),它返回一個將多個Replace調用鏈接在一起的lambda表達式。所以實際上你會有以下幾點:C#多取代理念

x => x.SomeMember.MultiReplace("ABC", "-") 

// Which would return a compiled expression equivalent to: 

x => x.SomeMember.Replace("A", "-").Replace("B", "-").Replace("C", "-") 

我想你對此的想法/輸入/建議。即使事實證明這是一個糟糕的主意,它似乎仍然是潛入表達樹的邪惡機會。您的反饋非常感謝。

-Eric

+1

更多示例您想爲此使用表達式樹的任何原因? – driis 2011-01-05 21:05:45

+6

我不知道有這樣的想要...! – Sean 2011-01-05 21:07:43

+0

@driis - 因爲我假設以上面列出的格式(使用多重鏈接的Replace()調用)返回一個lambda表達式,當使用Linq to Sql時,在轉換爲臨時Sql時不會引發錯誤。嘗試創建一個只需在循環中調用Replace()或使用Regex.Replace的擴展方法,就會出錯。 – Didaxis 2011-01-05 21:15:44

回答

1

我不完全確定你爲什麼想要做你正在描述的內容。但是如果你的動機是通過凝聚一些過濾邏輯來製作更具可讀性的linq語句,我建議查看Specification Pattern

但是,如果您只想轉換結果,我會建議僅在代碼中執行此操作,因爲在服務器上只能實現邊際收益轉換。

the Specification Pattern and Linq-to-SQL

+0

謝謝。你提供的第二個鏈接肯定是有用的。感謝您回答相關性,並在回答之前真正仔細閱讀我的問題。 – Didaxis 2011-01-05 21:40:42

0

對我來說,這似乎是一個真正壞主意,這可能是僅僅因爲你的榜樣,但你已經列出了我的語法是非常混亂。

讀這個我預計

x => x.SomeMember.MultiReplace("ABC", "-") 

如果使用下面的文字

ABC This Is A Test ABC Application 

你會得到這樣的事情

--- This Is A Test --- Application 

但你實際上是在說,這將是

--- This Is - Test --- -pplication 

其中我看到的問題....

我也想在這裏提到,我實在看不出這樣的事情正迫切需要。我想如果有需要做多個替代品,我會做以下其中一項。

  1. 鏈他們自己 「myInput」 .Replace( 「M」, 「 - 」)更換。( 「T」, 「 - 」)
  2. 創建功能/方法,它接受一個字符串數組或列表爲比賽,然後一個替換字符。保持容易理解。
+0

想象一下,您有幾個外部數據源可以跟蹤一些庫存編號。某些數據源用空格分隔數字的一部分,一些用破折號,一些用破折號和空格分開。要糾正這些不一致性,您需要用空字符串替換破折號和空格: – Didaxis 2011-01-05 21:13:24

+0

@Eric:Mitchel是對的。只需創建你自己的實用程序方法,接受一個字符串數組來代替破折號,這就是事實。對我來說,這聽起來像你有一個相當具體的問題,並試圖爲它創建一個通用的解決方案。把事情簡單化。 – 2011-01-05 21:16:16

+0

@siz:除傳遞字符串數組並循環替換調用不適用於Linq to Sql。 – Didaxis 2011-01-05 21:17:51

0

也許有沒有一種方法,將做到這一點,但你可以簡單地嵌套調用。或者創建一個靜態方法,它接受一個字符串和一個包含其所有替換項的數組。另一個問題是你需要實際指定一個對(原始子字符串及其替換)。

我從來沒有需要/想要這樣的功能。

1

我不確定MultiReplace應該做什麼,或者爲什麼要將它與Linq混合使用Sql。 (任何真正的LINQ工作到SQL會翻譯成SQL,這將是一個相當大量的工作,我想。)

我能想到的最好的解決方法是正則表達式。爲什麼不使用它們? Linq to Sql甚至可能已經爲你翻譯了它們,因爲MS SQL支持正則表達式。

x => Regex.Replace(x, "A|B|C", "-") 
+0

在那裏,完成了。 Regex.Replace不適用於Linq to Sql。 – Didaxis 2011-01-05 21:18:49

0

做的最好的方式,這將是:

static string MultiReplace(string this CSV, string Orig, string Replacement) 
{ 
    string final = ""; 
    foreach (string s in CSV.Split(',')) 
    { 
     final += s.Replace(Orig, Replacement); 
    } 
    return final; 
} 

然後,你可以毫不含糊稱之爲:

x => x.SomeMember.MultiReplace("A,B,C", "-") 

如果您希望這些字符串將長於3 -4值,您可能想要放棄連接以支持StringBuilder。

+0

謝謝,但它不適用於Linq to Sql。 – Didaxis 2011-01-05 21:23:49