我需要对列表项进行测试的匹配条件非常耗时。而且,我知道该条件将匹配列表中不超过3个项目。
因此,检查所有列表项可能不是最好的主意。但是,当我尝试最多使用3次FindFindex()
方法时,该测试所花费的时间比使用FindAll()
和Where()
的情况更多。
如何加快该方法的速度,或者更快地找到最多三场比赛?
| # Method Time (sec)
| -------------------------------
| 1 Find (one-by-one) 42.37
| 2 FindAll 30.17
| 3 Where 30.53
方法1:
{
int index;
Predicate<T> predicate = t =>
{
...
};
index = myCollection.FindIndex(predicate);
if (index != -1)
{
T t1 = myCollection[index];
myCollection.RemoveAt(index);
index = myCollection.FindIndex(predicate);
if (index != -1)
{
T t2 = myCollection[index];
myCollection.RemoveAt(index);
index = myCollection.FindIndex(predicate);
if (index != -1)
{
T t3 = myCollection[index];
return new T[] { t1, t2, t3 };
}
else
{
return new T[] { t1, t2 };
}
}
else
{
return new T[] { t1 };
}
}
else
{
return new T[] { };
}
}
方法2:
{
return myCollection.FindAll(t =>
{
...
}).ToArray();
}
方法3:
{
return myCollection.Where(t =>
{
...
}).ToArray();
}
编辑:修改方法1:
{
int index;
Predicate<T> predicate = t =>
{
...
};
index = myCollection.FindIndex(predicate);
if (index != -1)
{
T t1 = myCollection[index];
index = myCollection.FindIndex(index + 1, predicate);
if (index != -1)
{
T t2 = myCollection[index];
index = myCollection.FindIndex(index + 1, predicate);
if (index != -1)
{
T t3 = myCollection[index];
return new T[] { t1, t2, t3 };
}
else
{
return new T[] { t1, t2 };
}
}
else
{
return new T[] { t1 };
}
}
else
{
return new T[] { };
}
}
最佳答案
您的方法较慢,因为它会遍历整个集合三遍,并且您还要执行删除操作(也要付出代价(“ O(n),其中n是(计数-索引)”,according to MSDN))。
您可以通过调用FindIndex(int, predicate)
重载来逃避这两种情况,其中int
会在迭代源集合时谴责开始位置。
因此,请替换出现这种情况的两个地方:
myCollection.RemoveAt(index);
index = myCollection.FindIndex(predicate);
有了这个:
index = myCollection.FindIndex(index + 1, predicate)