У меня есть список и мне нужно обновить в нем значения. Эти обновления основаны на вычислениях, поэтому на каждой итерации значения могут меняться, но при каждой итерации начало списка остается прежним, меняются только последние элементы.
Чтобы сэкономить время обработки, я хочу начинать каждую итерацию только с первого различия.
Образец:
List<string> list = new List<string>();
List<string> updatedList = new List<string>();
list[0] = "A";
updatedList[0] = "A";
list[1] = "B";
updatedList[1] = "B";
list[2] = "C";
updatedList[2] = "C";
list[3] = "D";
updatedList[3] = "E";
Я хочу получить индекс 3 для этого образца.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> list = new List<string> { "A", "B", "C", "D" };
List<string> updatedList = new List<string> { "A", "B", "C", "E" };
int firstDifferenceIndex = FindFirstDifferenceIndex(list, updatedList);
Console.WriteLine("Index of the first difference: " + firstDifferenceIndex);
}
static int FindFirstDifferenceIndex(List<string> list1, List<string> list2)
{
for (int i = 0; i < list1.Count && i < list2.Count; i++)
{
if (list1[i] != list2[i])
{
return i;
}
}
return Math.Min(list1.Count, list2.Count);
}
}
Вы можете использовать операторы Zip
, Select
и FirstOrDefault
LINQ:
int? index =
list
.Zip(updatedList, (item, updated) => (item, updated))
.Select((pair, index) => (pair, index))
.FirstOrDefault(x => x.pair.item != x.pair.updated)
?.index;
Не самый производительный способ, но если он достаточно быстрый, то подойдет.
Спасибо! Это было очень быстрое решение, менее 2 миллисекунд. Количество позиций в списке не превышает 500.
// with the data from your entry post
int i, diffIndex; i = diffIndex = -1;
list.FirstOrDefault(el => updatedList.Count > ++i
&& !Equals(el, updatedList[i])
&& (diffIndex = i) > -1);
// diffIndex is now 3
Благодарим вас за вклад в сообщество Stack Overflow. Возможно, это правильный ответ, но было бы очень полезно предоставить дополнительные пояснения к вашему коду, чтобы разработчики могли понять ваши рассуждения. Это особенно полезно для новых разработчиков, которые не так хорошо знакомы с синтаксисом или пытаются понять концепции. Не могли бы вы отредактировать свой ответ, включив в него дополнительную информацию на благо сообщества?