2017-08-17 118 views
0

在代码的顶部:如何找到列表中具有相同值并操作此项目的所有项目?

[System.Serializable] 
    public class PosDisPair //Name the pair however you like 
    { 
     public float Distance; 
     public Vector3 Pos; 
    } 

然后:

private List<PosDisPair> pairList = new List<PosDisPair>(); 

而且

private void FindDistances() 
    { 
     pairList = new List<PosDisPair>(); 

     for (int i = 0; i < objects.Count; i++) 
     { 
      PosDisPair pairToAdd = new PosDisPair(); 
      pairToAdd.Distance = Vector3.Distance(EndStartPoints[0].transform.position, objects[i].transform.position); 
      pairToAdd.Pos = objects[i].transform.position; 
      pairList.Add(pairToAdd); 
     } 

     pairList.Sort(delegate (PosDisPair a, PosDisPair b) { 
      return (a.Distance.CompareTo(b.Distance)); 
     }); 

     Manip(); 
    } 

而在去年

private void Manip() 
    { 
     List<float> samedistances = new List<float>(); 

     pairList = pairList.OrderBy(x => x.Distance).ToList(); 

     for (int i = 0; i < pairList.Count; i++) 
     { 
      if (pairList[i].Distance == pairList[i+1].Distance) 
      { 
       samedistances.Add(pairList[i].Distance); 
      } 
     } 
    } 

内MANIP方法我使用排序依据,以分类List by distance属性。 所以现在第一个距离是0,所以我不需要做任何事情。

然后有三个项目,每个的距离是10. 但是每个项目的位置是不一样的。

我想要做的是每次从列表中取出所有相同的距离项目。例如,要取所有10个距离项目,从这三个项目中取一个随机项目。

旁边拾取两个20的距离项目的随机之一,并再次每个相同的距离项目。

所以最后我会列出所有项目,距离和位置,但从每个相同的距离将只有一个项目。

所以在成对列表结束时,我将具有用于例如:

索引0 =距离0

指数1 =距离10

索引2 =距离14.45456

索引3 =距离20 。 。 。 指数44 =距离134

相同的距离有彼此的位置。

例如:

索引1距离10,posiiton 1,1,1-

索引2距离10,位置2,1,1

索引3距离10,位置3,1 ,1

因此,当它将选择一个随机距离10时,它将与它自己的位置。

+0

它几乎一样,如果你有'GroupBy'一个属性,然后'Select'单个项目... – maccettura

回答

0

这将使您获得第一个元素,每个组中有多个元素。

var result = pairList.GroupBy(x => x.Distance).Select(y => y.FirstOrDefault()); 

要获得随机元素,试试这个:

Random rnd = new Random(); 
var resultRand = pairList.GroupBy(x => x.Distance).Select(y => y.ElementAt(rnd.Next(0, y.Count()))); 
+0

分组通过浮点数可能不是一个好主意。对于前'new [] {1f,Math.Sqrt(2)* Math.Sqrt(1.0/2)} .GroupBy(x => x).Count()'返回2 –

+0

@LB是的,我猜这是真的,但那么有没有办法比较两个浮点数100%?既然这是OP的最终目标,那么无论做什么,他/她都会面对这个问题?有没有很好的解决方案? – Sach

+0

这取决于问题的背景(我不知道)对于examle *“足够接近”*可以通过在((int)(distance * 100))上分组来定义' –

相关问题