如何在foreach中改进foreach

Mr *_*ace 2 c#

我在foreach循环中有一个foreach循环,如下所示:

// Item is an abstract class. Item1, Item2, etc. are his heirs.
List<Item> allItems = new List<Item> { new Item1(), new Item2(), new Item3(), new Item4() };
List<Type> affectedItems = new List<Type> { typeof(Item1), typeof(Item3) };

foreach(Item i in allItems)
    foreach(Type t in affectedItems)
        if(i.GetType().Equals(t))
        {
            // does something
        }
Run Code Online (Sandbox Code Playgroud)

如何改进我的代码,以便内循环不会浪费那么多时间检查列表中不存在的项目?

Zei*_*kki 5

你使用任何LINQ扩展方法(例如Where,Any)是一个额外的循环.

您需要最小化循环次数(尤其是嵌套循环次数),在您的情况下,最好的方法是使用快速查找数据结构:

List<Item> allItems = new List<Item>{ new Item1(), new Item2(), new Item3(), new Item4() };

HashSet<Type> affectedItems = new HashSet<Type>(){ typeof(Item1), typeof(Item3) };

foreach (Item i in allItems)
{
    if (affectedItems.Contains(i.GetType()))
    {
        // Do Something
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是最快的方法,循环次数最少,最多可达0.02毫秒,而其他方法则需要达到0.7.

一个快速的提醒,只要你有循环过程,并要优化一下数据结构使用像HashSet,Dictionary,Lookup,等.