List <string> .Contains using trim </string>

时间:2014-03-06 15:03:21

标签: c# .net string list

如果这样做会很好,但是它没有。

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;
}

2 个答案:

答案 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");