如何找到列表中具有相同值并处理此项目的所有项目?

时间:2017-08-17 17:48:20

标签: c# unity3d unity5

在代码之上:

[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时,它将与它自己的位置相关。

1 个答案:

答案 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())));