如果这样做会很好,但是它没有。
List<string> items = new List<string>();
items.Add("a ");
bool useTrim = true;
if (items.Contains("a", useTrim)) {
Console.WriteLine("I'm happy");
}
我最终将其作为扩展方法实现如下。但我想知道除了创建比较器类或循环之外,是否有其他人有任何优雅的想法。
/// <summary>
/// Determines whether an element in the List of strings
/// matches the item. .Trim() is applied to each element
/// for the comparison
/// </summary>
/// <param name="value">a list of strings</param>
/// <param name="item">the string to search for in the list</param>
/// <returns>true if item is found in the list</returns>
public static bool ContainsTrimmed(this List<string> value, string item) {
bool ret = false;
if ((value.FindIndex(s => s.Trim() == item)) >= 0) {
ret = true;
}
return ret;
}
答案 0 :(得分:4)
那么你每次都需要循环它,或者创建另一个仅包含修剪值的列表,然后使用它进行搜索。 (哎呀,如果你只需要知道修剪后的值是否存在,你可以创建一个HashSet<string>
。)
但是,如果你只想坚持一个列表,那么我不是使用FindIndex
而是使用来自LINQ的Any
:
if (items.Any(x => x.Trim() == item))
请注意,即使您执行想要保留ContainsTrimmed
方法,也可以将其简化为:
return value.FindIndex(s => s.Trim() == item) >= 0;
答案 1 :(得分:1)
我建议您创建一个自定义IEqualityComparer
以提供给重载的函数Contains
。
这正是存在这种过载的原因。
class TrimmedEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
if (x == null && y != null || x != null && y == null)
return false;
if (x == null && y == null)
return true;
return x.Trim() == y.Trim();
}
public int GetHashCode(string obj)
{
return obj != null ? obj.GetHashCode() : 0;
}
}
你这样称呼它。
var strs = new string[] {"a ", "b ", "c"};
if (strs.Contains("b", new TrimmedEqualityComparer()))
Console.WriteLine("I'm happy");