组合不重复

时间:2010-02-28 13:36:54

标签: c# algorithm combinations

我有收藏List<Car>

如何比较此集合中的每个项目与休息而不重复。

例如:

  1. 迭代:
  2. 这辆车是奥迪,第二辆车是宝马

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

    这是不允许的:

    n迭代

    这辆车是宝马,第二辆车是奥迪

    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与car2,下一辆car2是基地汽车而car1是第二汽车)

    对不起我糟糕的英语

3 个答案:

答案 0 :(得分:4)

不要遍历集合,遍历索引

for (i = 0; i < length(cars); i++) {
    for (j = i+1; j < length(cars); j++) {
        <do comparison>
    }
}

答案 1 :(得分:3)

以下是从列表中获取唯一组合的简单方法。

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

答案 2 :(得分:3)

我要重复其他人所说的话并向他们解释你的评论(这是错误的):

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