Я только что реализовал эту простую функцию CLR с C # для моего SQL Server, но обнаружил, что мне нужно заменить еще 20 пар, и некоторые замены выполняются в конце строки, поэтому я предполагаю, что это должно быть Regex ( ?).
Что бы было неплохо организовать этот код, ниже приведен пример с одной парой. Я новичок в C #, возможно, стоит подумать о том, чтобы поместить эти пары в массив и цикл, но, вероятно, есть лучшее решение, которое я могу обойти без цикла, как в Ruby.
В то же время я могу повторить этот блок также 20 раз, если это будет быстрее.)
Tx Я вижу какой-то метод со словарем, но получил некоторые ошибки. Как сказать C #, что это может быть только часть строки, а не вся строка?
select top 1 CLR_AddressM('alpha lane') from sys.objects
System.Collection.Generic.KeyNotFoundException: Указанный ключ отсутствует.
using System;
using System.Data.SqlTypes;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Linq;
namespace CLR_Functions
{
public partial class CLRFunctions
{ [SqlFunction( DataAccess = DataAccessKind.None, FillRowMethodName = "MyFillRowMethod" , IsDeterministic = true) ]
public static string AddressM(string AddressIn)
{
if (string.IsNullOrEmpty(AddressIn)) return AddressIn;
var xmlEntityReplacements = new Dictionary<string, string> {
{ "Lane$", "Ln" }, { "Avenue", "Ave" }, { "Boulevard", "Blvd" },{ "Street", "St;" }, { ".", "" } };
// Create an array and populate from the dictionary keys, then convert the array
// to a pipe-delimited string to serve as the regex search values and replace
return Regex.Replace(AddressIn, string.Join("|", xmlEntityReplacements.Keys.Select(k => k.ToString()).ToArray()), m => xmlEntityReplacements[m.Value]);
} } }