使用其他列表中定义的char替换列表中不需要的char

时间:2015-07-03 06:52:04

标签: c#

我有两个List<T>个收藏品。一个用于用户搜索首选项,另一个用于不需要的字符。要求是用第二个列表中定义的char替换第一个列表中不需要的字符。

我刚刚通过遍历第一个列表进行了替换。然后在循环内部,通过第二个列表开始另一次迭代并替换每个不需要的char。

public class Test
{
    public void DoTest()
    {
        //For test purpose, create the filter list.
        var filterList = new List<Filter>
        {
            new Filter(){ Column="UserName", Value="O'Connor", Operator="start-with"},
            new Filter(){ Column="SRCount", Value="2", Operator="Equal"}
        };
        //Replace the unwanted chars(like single quotes with double) in search string.
        UnwantedCharReplacement(filterList);
    }

    private void UnwantedCharReplacement(IList<Filter> filters)
    {
        //Get the list of 'Filter' class which contains the unwanted chars.
        var lists = from filter in filters
                    where UnwantedCharacterList.All.Any(c => filter.Value.Contains(c.Key))
                    select filter;

        //Loop through each 'Filter' list
        foreach (var list in lists)
        {
            //Loop through available unwanted char list, then replace.
            UnwantedCharacterList.All.ForEach(u =>
            {
                list.Value = list.Value.Replace(u.Key, u.Value);
            });
        }
    }
}

/// <summary>
/// This class is using for holding the user's search preferences.
/// </summary>
public class Filter
{
    public string Column { get; set; }
    public string Operator { get; set; }
    public string Value { get; set; }
}
/// <summary>
/// This class using for replacing characters like single quotes...etc in search string.
/// </summary>
internal static class UnwantedCharacterList
{
    public static KeyValuePair<string, string> Apostrophe = new KeyValuePair<string, string>("'", "''");

    public static List<KeyValuePair<string, string>> All
    {
        get { return new List<KeyValuePair<string, string>> { Apostrophe }; }
    }
}

所以我想知道是否有一种更优化的方法可以让我获得更好的性能?

1 个答案:

答案 0 :(得分:1)

您的foreach循环无效,因为您的list.Value不属于任何列表。要保存更改,您的lists变量必须是列表&lt;&gt;或阵列。虽然这是你的意图,但是很容易修复 - 在原始查询上调用.ToList。 此外,您一直在谈论'char'替换,但您的UnwantedCharacterList包含单字符字符串。从技术上讲,它们不一样。

现在,如果我们谈论替换,而不是在foreach循环内,您可以使用.Aggregate

list.Value =  UnwantedCharacterList.All
    .Aggregate(list.Value, (result, replacement) =>
        result.Replace(replacement.Key, replacement.Value);

如果您需要替换“不需要的”字符,那么您必须坚持使用外部foreach循环。如果您可以返回新序列,则可以使用查询:

var replaced = filterList.Select(filter =>
    new Filter
    {
         Column = filter.Column,
         Value = UnwantedCharacterList.All
            .Aggregate(list.Value, (result, replacement) =>
                result.Replace(replacement.Key, replacement.Value), 
         Operator = filter.Operator
    });

我也可能在UnwantedCharacterList中创建一个单独的方法,该方法将包含.Aggregate调用。

编辑:我有点太快,无法建议使用外部foreach循环进行就地更改。当然,您需要使用.ForEach() List方法。