C# 不重复的组合

C# 不重复的组合,c#,algorithm,combinations,C#,Algorithm,Combinations,我有收藏列表 如何在不重复的情况下将此集合中的每个项目与rest进行比较 例: 迭代: 这辆车是奥迪,第二辆车是宝马 bool IsSimilar(Car secondCar) { if(this.Name==secondCar.Name) return true; return false; } 这是不允许的: n迭代 这辆车是宝马,第二辆车是奥迪 bool IsSimilar(Car secondCar) { if(this.Name==secondCar.Name) retu

我有收藏
列表

如何在不重复的情况下将此集合中的每个项目与rest进行比较

例:

  • 迭代:
  • 这辆车是奥迪,第二辆车是宝马

    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);
          }
        }
      }
    }
    
    List car=new List();
    列表对=新列表();
    pairs.Cars=新列表();
    foreach(汽车中的汽车)
    {
    foreach(汽车中的第二辆汽车)
    {
    如果(第二辆车!=车)
    {
    if(car.Name==secondCar.Name&&car.Owner==secondCar.Owner)
    {
    Pair Pair=新的Pair();
    pair.Cars.Add(car);
    pair.Cars.Add(secondCar);
    配对。添加(配对);
    }
    }
    }
    }
    
    我只是不想两次比较车(你们知道第一次迭代比较车1和车2,下一次车2是基本车,车1是第二辆车)


    对不起,我的英语糟糕透了

    这里有一个从列表中获取唯一组合的简单方法

    for(int i = 0; i < list.Count; i++)
        for(int j = i + 1; j < list.Count; j++)
            // perform operation
    
    for(int i=0;i
    不要在集合上循环,而是在索引上循环

    for (i = 0; i < length(cars); i++) {
        for (j = i+1; j < length(cars); j++) {
            <do comparison>
        }
    }
    
    for(i=0;i
    我将重复其他人说过的话,并向他们解释你的评论(这是错误的):

    for(int i=0;i
    你对这项技术的评论是“不,不是这个。看:i=0,j=1我们有[…],i=1,j=0我们有[…]”


    您错过的是
    j
    总是从
    i+1
    开始。因此,决不会像你提到的那样,
    i=1和j=0

    不知道你想要什么。你能解释一下你所说的“比较”是什么意思吗(检查是否相等、排序等)。输出应该是什么样的?作为比较的输出,您希望得到什么?不清楚您想要做什么。您正在尝试创建一个没有重复的排序列表吗?-如果是这样,您是否尝试过使用LINQ?我想搜索具有相同属性的项目。如果我有100个项目,我想使用这样的方法:foreach(Car-Car-in-cars){foreach(Car-secondCar-in-cars){If(secondCar!=Car){car1.IsSimilar(car2);}}}}}}但是没有重复,所以如果我在比较car1和car2之前我不想再做一次。方法IsSimilar不会返回bool,但可以这样做:List pairs=new List(Pair)可能将其命名为组合不是个好主意…它引入了混乱…而且-如果Car1与Car3相似,那么它是否一定意味着Car3与Car1相似?不,不是这样。看:i=0,j=1,我们有car1和car2。i=1,j=0我们有车2和车1。我不想重复同样的工作(检查对象的属性,因为它已经在上一次迭代中完成了)@phenevo:当I=1时,j将从2开始,永远不会是0。这就是重点。不,不是这个。看:i=0,j=1,我们有car1和car2。i=1,j=0我们有车2和车1。我不想重复同样的工作(检查对象的属性,因为它在上一次迭代中已经完成了),当I=1时,j将从I+1=1+1=2开始,所以您不会两次比较。当i=1时,j永远不会是0。@phenevo,用sirlark的方法,你永远不会有i=1和j=0,因为j的起始值总是比i的当前值高。是的,对不起(咖啡昨天结束:)
    for (int i = 0; i < N; i++) {
        for (int j = i+1; j < N; j++) {
            <do something>
        }
    }