Сочетание без повторения - PullRequest
0 голосов
/ 28 февраля 2010

У меня есть коллекция List<Car>.

Как сравнить каждый предмет из этой коллекции с отдыхом без повторения.

Ex:

  1. итерация:

это автомобиль Audi, а второй автомобиль - BMW

bool IsSimilar(Car secondCar)
{
  if(this.Name==secondCar.Name) return true;
  return false;
}

это не разрешено:

n итераций

это автомобиль BMW, а второй автомобиль - Audi

bool IsSimilar(Car secondCar)
{
  if(this.Name==secondCar.Name) return true;
  return false;
}

Яснее:

List<Car> car=new List<Car>();
List<Pair> pairs=new List<Pair>();
pairs.Cars=new List<Car>();

foreach(Car car in cars)
{
  foreach(Car secondCar in cars)
  {
    if(secondCar!=car)
    {
      if(car.Name==secondCar.name && car.Owner==secondCar.Owner)
      {
        Pair pair=new Pair();
        pair.Cars.Add(car);
        pair.Cars.Add(secondCar);
        pairs.Add(pair);
      }
    }
  }
}

Я просто не хочу сравнивать автомобили дважды (вы знаете, первая итерация сравнивает автомобиль 1 с автомобилем 2, следующий автомобиль2 - базовый автомобиль, а автомобиль 1 - второй автомобиль)

Извините за мой ужасный английский

Ответы [ 3 ]

4 голосов
/ 28 февраля 2010

Не зацикливать коллекцию, зацикливать индексы

for (i = 0; i < length(cars); i++) {
    for (j = i+1; j < length(cars); j++) {
        <do comparison>
    }
}
3 голосов
/ 28 февраля 2010

Я собираюсь повторить то, что сказали другие, и объяснить им ваши комментарии (что было ошибочным):

for (int i = 0; i < N; i++) {
    for (int j = i+1; j < N; j++) {
        <do something>
    }
}

Вы прокомментировали эту технику, что " нет, это не так. Смотрите: i = 0, и j = 1, у нас [...]. I = 1, а j = 0 у нас есть [. ..] ».

Что вы пропустили, так это то, что j всегда начинается с i+1. Так что никогда не будет i=1 and j=0, как вы упомянули!

3 голосов
/ 28 февраля 2010

Вот простой способ получить уникальные комбинации из списка.

for(int i = 0; i < list.Count; i++)
    for(int j = i + 1; j < list.Count; j++)
        // perform operation
...