我有 2 个foreach
嵌套项类,在其中我遍历两个列表,如果在列表 2 中找到列表 1 的元素,它必须执行几个操作,困境是在处理非常长的列表时,它需要一个很多,我需要改善那个时间。
代码:
foreach (Articulo x in Articulos) //Lista Principal
{
foreach(Articulo y in listSec)
{
if (y.Art_CodGen == x.Art_CodGen) //Si son Iguales
{
if (y.Precios[0] != x.Precios[i]) //Y tienen distinto precio
{
updatedRows += UpdateArticulo(x, i); // Actualizo
}
}
}
}
如果你想提高性能,你可以使用
Thread
或ForEach
async 更快地循环它们。实现此操作的一种方法是使用函数Parallel.ForEach<TSource>(IEnumerable<TSource> source, Action<TSource> body);
同样在第二次搜索中,您可以
Linq
只搜索您需要通过的那些(尽管它毕竟是一个搜索但更优化)。此解决方案的实施示例如下所示:
我在您的代码中看到的细节是,对于列表 1 中的每个项目,您将完全通过列表 2,因为您的if所做的是确定它们在 Art_CodGen 中是相同的并且它们的价格不同,最终更新,这不会停止列表 2 的 foreach 并保持迭代对象以及仍然评估和影响应用程序的性能。我会给你留下我在这些情况下使用的代码片段,我将在下面向你详细解释:
现在我将解释我设置的场景,我定义了一个具有两个属性的人类型对象,你知道为了简化事情:
创建了两个人员类型列表:
对象被添加到列表中,请注意,其中三个人将同时出现在两个列表中 (
Katz , Manuel y Uriel
)。场景已经定义,现在如果我向您解释代码,执行单个 foreach 遍历第一个列表中的人员类型对象,在第一个列表的 foreach 中创建一个辅助人员对象,现在这是您必须注意的部分:
使用函数
FirstOrDegault
和 lambda 表达式(非常有用)执行搜索,其中评估列表 1 的 pItem 对象的代码 (ID) 在列表 2 中找到:如果它在列表 2 中找到喜欢它的人,则 perAux 对象不会为空 ,并且您也可以执行其他 if(带有价格的对象),因为perAux对象是您从列表 2和pItem中提取的对象是列表 1中的一个,也就是说,您有两个对象来执行您需要的逻辑。
这是程序的输出。
您可以应用二进制搜索。我将解释这个想法:
优势:
您总是划分集合并选择您的对象肯定可以在其中的集合。
例子:
5
{12,5, 1 , 4, 49, 89}
5 {1,4,5,12,49,89}
5 {1,4,5}{12,49,89}
this 在第一个子集中,49 是第二个集合的第一个元素,并且 49 大于 5,所以 5 不在第二个子集中。
第二次迭代 {1,4,5}