У меня есть список данных без дубликатов. Для этого примера я скажу, что мой списокВыполните операцию над каждым элементом в списке по всем другим элементам в списке с исключениями
List<string> list1 = new List<string>() { "A", "B", "C", "D" };
Я хочу, чтобы выполнить свою работу по каждому пункту в списке против каждого другого элемента в списке, за исключением, когда я уже выполнил свою работу на них (AB и BA) или если они одинаковы (AA).
EG.
A against B
A against C
A against D
B against C
B against D
C against D
Теперь это довольно просто сделать, но мой список очень большой, и этот процесс может занять много времени. Также с данными, которые у меня есть, мне не нужно запускать операцию по сопоставлению данных или если операция уже выполнена
EG.
A against A - Skip
A against B - Good
A against C - Good
A against D - Good
B against A - Skip (we already did A against B)
B against B - Skip
B against C - Good
B against D - Good
C against A - Skip
и так далее.
То, что я искал (и я даже не знаю, существует ли оно), - это простой метод, который я могу использовать для этого, вместо того, чтобы отключать два цикла и выполнять свою работу и сохранять результаты для сравнения с более поздними ,
Перебор в списке O(n*n)
но мне не нужно сравнивать более половины результатов это пустая трата времени, как я знаю, что мне нужно только проверить O(n*(n/2))
код, я в настоящее время используя следующим образом
List<string> list1 = new List<string>() { "A", "B", "C", "D" };
List<string> list2 = new List<string>(list1);
List<string> listResult = new List<string>();
list2.Reverse();
int i = 0;
foreach (var a in list1)
{
for (int j = 0; j < (list2.Count/2); j++)
{
i++;
Console.WriteLine("Looped {0} times", i);
// Don't run against ourself
if (a == list2[j])
continue;
if (listResult.Count(x => (x == a + list2[j]) || (x == list2[j] + a)) == 0)
{
listResult.Add(a + list2[j]);
// Perform some operation here
// operation(a, list2[j]);
}
}
}
Приведенный выше код работает нормально (я должен был бы регулировать часть list2.Count/2 для учета нечетным нумерованного списка).
Есть ли лучший способ сделать это? Метод расширения LINQ, который я пропустил? Моя проблема в том, что я действительно не знаю, что для Google.
Я задавался вопросом, был ли метод, который возвратил бы список, содержащий только те элементы, которые я хотел бы, чтобы затем прокрутить и выполнить свою операцию. Возможно, что-то использует .SelectMany()
ли все элементы в списке уникальны? т. е. Может ли ваш список когда-либо быть «A B A C D»? –
Есть ли дубликаты в 'list1'? – ASh
(BTW - приведенный выше код пропускает операцию на A и B.) –