列出其他列表性能

时间:2018-03-27 12:52:08

标签: c# linq

我有一个字符串列表:

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()):
  1. 有没有更好的表现呢? 我不确定All in Inside是否是最佳方法。

  2. 是否可以使用ToLower来区分大小写?

2 个答案:

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