2017-08-17 148 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))上分組來定義' –

相關問題