在代码之上:
[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方法我正在使用OrderBy按距离属性对List进行排序。 所以现在第一个距离为0所以我不需要做任何事情。
然后有三个项目,每个项目的距离是10。 但每个项目的位置都不一样。
我想做的是每次从列表中取出所有相同距离的物品。例如,将所有10个距离的项目从这三个项目中取出一个随机项目。
接下来随机拾取两个20个距离项目中的一个,并再次拾取每个相同距离的项目。
所以最后我会有一个列表,其中包含所有项目,距离和位置,但每个相同的距离只有一个项目。
所以最后在pairList中我会有例如:
索引0 =距离0
指数1 =距离10
指数2 =距离14.45456
指数3 =距离20 。 。 。 指数44 =距离134
相同的距离各有一个位置。
例如:
指数1距离10,位置1,1,1
指数2距离10,位置2,1,1
指数3距离10,位置3,1,1
因此,当它选择一个随机距离10时,它将与它自己的位置相关。
答案 0 :(得分: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())));