在列表中找到匹配项的最干净方法
时间:2020-03-05 18:42:19 来源:igfitidea点击:
在列表中查找内容的最佳方法是什么?我知道LINQ有一些不错的技巧,但让我们也获得有关C2.0的建议。让我们为此通用代码模式获得最佳重构。
目前,我使用这样的代码:
// mObjList is a List<MyObject> MyObject match = null; foreach (MyObject mo in mObjList) { if (Criteria(mo)) { match = mo; break; } }
或者
// mObjList is a List<MyObject> bool foundIt = false; foreach (MyObject mo in mObjList) { if (Criteria(mo)) { foundIt = true; break; } }
解决方案
回答
将代码放入方法中,可以保存一个临时代码和一个" break"(回收代码,作为奖励):
T Find<T>(IEnumerable<T> items, Predicate<T> p) { foreach (T item in items) if (p(item)) return item; return null; }
但是当然,即使在.NET 2.0中,此方法对于List仍然已经存在。
回答
@ Konrad: So how do you use it? Let's say I want to match mo.ID to magicNumber.
在C2.0中,我们将编写:
result = mObjList.Find(delegate(int x) { return x.ID == magicNumber; });
3.0知道lambda:
result = mObjList.Find(x => x.ID == magicNumber);
回答
使用Lambda表达式:
List<MyObject> list = new List<MyObject>(); // populate the list with objects.. return list.Find(o => o.Id == myCriteria);
回答
显然,匿名代表的表现受到很大影响。
测试代码:
static void Main(string[] args) { for (int kk = 0; kk < 10; kk++) { List<int> tmp = new List<int>(); for (int i = 0; i < 100; i++) tmp.Add(i); int sum = 0; long start = DateTime.Now.Ticks; for (int i = 0; i < 1000000; i++) sum += tmp.Find(delegate(int x) { return x == 3; }); Console.WriteLine("Anonymous delegates: " + (DateTime.Now.Ticks - start)); start = DateTime.Now.Ticks; sum = 0; for (int i = 0; i < 1000000; i++) { int match = 0; for (int j = 0; j < tmp.Count; j++) { if (tmp[j] == 3) { match = tmp[j]; break; } } sum += match; } Console.WriteLine("Classic C++ Style: " + (DateTime.Now.Ticks - start)); Console.WriteLine(); } }
结果:
Anonymous delegates: 710000 Classic C++ Style: 340000 Anonymous delegates: 630000 Classic C++ Style: 320000 Anonymous delegates: 630000 Classic C++ Style: 330000 Anonymous delegates: 630000 Classic C++ Style: 320000 Anonymous delegates: 610000 Classic C++ Style: 340000 Anonymous delegates: 630000 Classic C++ Style: 330000 Anonymous delegates: 650000 Classic C++ Style: 330000 Anonymous delegates: 620000 Classic C++ Style: 330000 Anonymous delegates: 620000 Classic C++ Style: 340000 Anonymous delegates: 620000 Classic C++ Style: 400000
在每种情况下,使用匿名委托都比其他方式慢100%。