2013-04-18 116 views
2

以下代碼片段顯示std::vector C++庫中的iterator。什麼是C#等同於此?我是否可以簡單地遍歷向量中的每個項目,因爲它不是鏈接列表?迭代器到底在做什麼以及如何在C#中執行相同的操作?完整的代碼是here什麼是C#等價於std :: vector :: iterators?

std::vector<KMeanCluster>::iterator closest_cluster = clusters.begin(); 

    // Figure out which cluster this color is closest to in RGB space. 
    for (std::vector<KMeanCluster>::iterator cluster = clusters.begin(); 
     cluster != clusters.end(); ++cluster) { 
     uint distance_sqr = cluster->GetDistanceSqr(r, g, b); 

     if (distance_sqr < distance_sqr_to_closest_cluster) { 
     distance_sqr_to_closest_cluster = distance_sqr; 
     closest_cluster = cluster; 
     } 
    } 

回答

5

C++標準庫迭代器的方式定義爲表現得像是通過集合步行指針訪問迭代器。在C#中,實現IEnumerable的每個集合都可以在foreach循環中迭代。除此之外,你仍然可以使用Enumerator C#的類似於C++迭代器的東西(這使得事情在大多數情況下更難):

IEnumerable<int> myCollection = new List<int> { 1, 2, 3 }; 
var enumerator = myCollection.GetEnumerator(); 
while(enumerator.MoveNext()) 
    Console.WriteLine(enumerator.Current); 

其實上面的是如何通過引擎蓋下集合的foreach循環迭代。

foreach(int num in myCollection) 
    Console.WriteLine(num); 

因此,在你的代碼而言,這是確切的(但很難編寫和理解)等同:

IEnumerator<KMeanCluster> closest_cluster = clusters.GetEnumerator(); 
while (closest_cluster.MoveNext()) 
{ 
    uint distance_sqr = closest_cluster.Current.GetDistanceSqr(r, g, b); 
    if (distance_sqr < distance_sqr_to_closest_cluster) 
    { 
     distance_sqr_to_closest_cluster = distance_sqr; 
     closest_cluster = cluster; 
    } 
} 

,這是最簡單的等同:

foreach(KMeanCluster closest_cluster in clusters) 
{ 
    uint distance_sqr = closest_cluster.GetDistanceSqr(r, g, b); 
    if (distance_sqr < distance_sqr_to_closest_cluster) 
    { 
     distance_sqr_to_closest_cluster = distance_sqr; 
     closest_cluster = cluster; 
    } 
} 
+0

優秀的答案。 –

2

迭代器基本上是一個允許對容器進行串行,非隨機訪問的對象。無論如何:你可以在C#中使用正常的循環。 foreach循環是有點接近C++原syntaxwise

2

在C#中,這可能是這樣的:

var closest_cluster = clusters.FirstOrDefault(); 
foreach (var cluster in clusters) 
{ 
    uint distance_sqr = cluster.GetDistanceSqr(r, g, b); 
    if (distance_sqr < distance_sqr_to_closest_cluster) 
    { 
     distance_sqr_to_closest_cluster = distance_sqr; 
     closest_cluster = cluster; 
    } 
} 

什麼foreach運營商所做的是它的使用IEnumerator下,這相當於你的迭代器。

+1

這將引發如果'clusters'不包含任何元素,則與C++代碼不同。 'FirstOrDefault()'可能更合適。 – hvd

+0

@ hvd,當然。謝謝。 –

+0

當然,在嘗試使用'closest_cluster' – JohnL

2

泛型集合 - IEnumerator<T>

支持在泛型集合上進行簡單迭代。

非泛型集合 - IEnumerator

支持在非泛型集合上進行簡單迭代。

這些是接口,應該繼承和覆蓋。方法如MoveNextReset。然後你可以在循環中使用這個類。

1

C#中有一個iterator構造,但在這種情況下,您不需要直接訪問它,而是使用foreach循環。代碼可能看起來像這樣。

Cluster closestCluster = clusters.firstOrDefault(); 

foreach (Cluster currentCluster in clusters) 
{ 
    //Distance logic 
    if (distanceSqr < distanceSqrToClosestCluster) 
    { 
     closestCluster = currentCluster; 
    } 
} 

在內部,foreach通過IEnumerable<Cluster>接口

相關問題