我有一个字符串列表:
List<String> names = new List<String> { "aa", "Bb", "cC", "DD" }
以及类别列表:
List<Category> categories = service.GetAllCategories();
其中类别是以下类别:
public class Category {
public int Id { get; set; }
public string Name { get; set; }
}
我需要知道是否在类别中找到所有名称(使用不区分大小写):
bool check = names.All(x => categories.Any(y => x.ToLower() == y.Name.ToLower()):
有没有更好的表现呢? 我不确定All in Inside是否是最佳方法。
是否可以使用ToLower来区分大小写?
答案 0 :(得分:8)
1)是的,您可以使用效率更高的!Except
+ Any
,因为它使用了一套。
bool check = !names.Except(categories.Select(c => c.Name), StringComparer.CurrentCultureIgnoreCase).Any();
2)不要使用ToLower
而不是不区分大小写的方式进行比较,而不是StringComparer
。
答案 1 :(得分:2)
有没有更好的性能呢?我不确定是否有 内部全部是最好的方法
这取决于集合中的元素数量。对于小型集合,可以使用O(N2)
复杂度,因为此操作可能需要几毫秒。
对于更大的集合并提高性能,您可以使用HashSet<T>
:
var categoryNames = new HashSet<string>(categories.Select(c => c.Name));
bool check = names.All(x => categoryNames.Contains(x.ToLower()):
这个.Contains
将是一个快速的O(1)查找,将整体复杂性改为O(N),但它带来了创建HashSet<T>
实例所需的时间价格。
-
是否有替代方法可以使用ToLower来区分大小写?
是的,您可以使用接受StringComparison参数的string.Equals
重载之一:
y.Equals(x, StringComparison.CurrentCultureIgnoreCase);