У меня есть единственный список объектов, из которых я хочу сделать уникальные комбинации.Как эффективно получить уникальные комбинации списка объектов
Объекты, которые у меня есть (CityObj);
public string City_Name;
public int Population;
double xcord;
double ycord;
double zcord;
Результатом будет список, который содержит новый объект (CityComboObj)
public string City_NameA;
public int PopulationA;
double xcordA;
double ycordA;
double zcordA;
public string City_NameB;
public int PopulationB;
double xcordB;
double ycordB;
double zcordB;
Образец набора данных следующим образом;
- City1 | 3840 | 42 | -12 | 5
- City2 | 39402 | 1 | 59 | -5
- Город3 | 5934 | 99 | -55 | 3
- City4 | 12394 | -56 | 9 | 16
Результирующий список объектов будет выглядеть;
City1 | 3840 | 42 | -12 | 5 City2 | 39402 | 1 | 59 | -5
City1 | 3840 | 42 | -12 | 5 Город3 | 5934 | 99 | -55 | 3
City1 | 3840 | 42 | -12 | 5 Город4 | 12394 | -56 | 9 | 16
City2 | 39402 | 1 | 59 | -5 Город3 | 5934 | 99 | -55 | 3
City2 | 39402 | 1 | 59 | -5 Город4 | 12394 | -56 | 9 | 16
City3 | 5934 | 99 | -55 | 3 Город4 | 12394 | -56 | 9 | 16
Как вы можете видеть только его уникальные результаты.
В настоящее время я использую ужасно неэффективный apporach, чтобы делать это;
foreach (var element in CityListA)
{
if (!CityListB.Any(o => o.City_NameA == element.City_NameA && o.City_NameB == element.City_NameB))
{
if (!CityListB.Any(o => o.City_NameA == element.City_NameB && o.City_NameB == element.City_NameA))
{
CityListB.add(element)
}
}
}
В двух словах подход должен принять два списка один полный и один пустой, сравнить каждый элемент полного списка с пустым списком, чтобы увидеть, если она существует, или транспонированная существует, и если он не добавляет Это.
Он работает, но он медленный, есть ли лучший способ сделать это?
Thanks
Вы можете объединить 'Any' вызовы, для одного. – Abion47
Как насчет запуска с 'if (! CityListB.Any (o => (o.City_NameA == element.City_NameA && o.City_NameB == element.City_NameB) || (o.City_NameA == element.City_NameB && o.City_NameB == element.City_NameA))) 'так что вы не зацикливаете дважды? –
Ваша проблема: «У меня есть последовательность уникальных элементов длины n. Я хочу сгенерировать все подпоследовательности длины k <= n". Я написал серию статей о различных методах, чтобы сделать это. Серия начинается здесь: https://ericlippert.com/2014/10/13/producing-combinations-part-one/ Но если вас не интересует теория и вы просто хотите код, она здесь: https: // gist.github.com/ericlippert/69c9e93b366f8cc5d6ac –