我有两个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 }; }
}
}
所以我想知道是否有一种更优化的方法可以让我获得更好的性能?
答案 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
方法。