在List中搜索字符串的更好方法

时间:2017-05-26 12:37:08

标签: c# linq search

我已经通过以下代码来搜索特定值的对象列表:

List<customer> matchingContacts = cAllServer
  .Where(o => o.customerNum.Contains(searchTerm) || 
              o.personInv.lastname.Contains(searchTerm) || 
              o.personDel.lastname.Contains(searchTerm))
  .ToList();

是否有更快捷或更清洁的方式来实现此搜索?

3 个答案:

答案 0 :(得分:1)

由于您必须遍历所有列表项,因此它将具有O(n)复杂性。性能还取决于您是在IQueryable集合上运行(有或没有延迟加载),或者它是一个序列化的IEnumerable集合。我建议首先检查最有可能具有您正在搜索的值的属性,因为您正在使用&#34;或&#34;操作员,这样你就可以加速你的&#34;包含&#34;操作。如果您知道它在10毫秒而不是25毫秒内与特定实体匹配,则可以更快地迭代。还有一个流行的说法是什么更快?包含还是IndexOf?那么IndexOf应该快一点,但我怀疑你会注意到它,除非你在具有数百万元素的列表上操作。 Is String.Contains() faster than String.IndexOf()?

答案 1 :(得分:0)

我认为这很好,但另一方面我会考虑转换到列表的需要,你已经在接受一个I​​Enumerable类型,它会让你迭代。除非您需要来回查看列表并按索引搜索,否则您无需将其转换为List。

这是一个小优化。

答案 2 :(得分:0)

我建议的一件事是创建一个新的“searchtext”列,预先填充(o.customerNum + "|" + o.personInv.lastname + "|" + o.personDel.lastname).ToUpper()

List<customer> matchingContacts = cAllServer
  .Where(o => o.searchtext.Contains(searchTerm))
  .ToList();

这会执行一次搜索而不是三次搜索(但是在较长的字符串上),而你.ToUpper() searchTerm,你可以执行一个案例敏感的搜索,这种搜索更加轻松。

总的来说,我不希望这会明显加快。