我已经通过以下代码来搜索特定值的对象列表:
List<customer> matchingContacts = cAllServer
.Where(o => o.customerNum.Contains(searchTerm) ||
o.personInv.lastname.Contains(searchTerm) ||
o.personDel.lastname.Contains(searchTerm))
.ToList();
是否有更快捷或更清洁的方式来实现此搜索?
答案 0 :(得分:1)
由于您必须遍历所有列表项,因此它将具有O(n)复杂性。性能还取决于您是在IQueryable集合上运行(有或没有延迟加载),或者它是一个序列化的IEnumerable集合。我建议首先检查最有可能具有您正在搜索的值的属性,因为您正在使用&#34;或&#34;操作员,这样你就可以加速你的&#34;包含&#34;操作。如果您知道它在10毫秒而不是25毫秒内与特定实体匹配,则可以更快地迭代。还有一个流行的说法是什么更快?包含还是IndexOf?那么IndexOf应该快一点,但我怀疑你会注意到它,除非你在具有数百万元素的列表上操作。 Is String.Contains() faster than String.IndexOf()?
答案 1 :(得分:0)
我认为这很好,但另一方面我会考虑转换到列表的需要,你已经在接受一个IEnumerable类型,它会让你迭代。除非您需要来回查看列表并按索引搜索,否则您无需将其转换为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,你可以执行一个案例敏感的搜索,这种搜索更加轻松。
总的来说,我不希望这会明显加快。