簡體   English   中英

什么是等效於std :: vector :: iterators的C#?

[英]What is the C# equivalent to std::vector::iterators?

以下代碼片段顯示了std::vector C ++ lib中的iterator 什么是C#相當於此? 我可以簡單地遍歷向量中的每個項目,考慮到它不是鏈表嗎? 迭代器究竟在這做什么以及如何在C#中執行等效操作? 完整的代碼在這里

 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;
      }
    }

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;
    }
}

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

在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 ,這相當於你的迭代器。

通用集合 - IEnumerator<T>

支持對泛型集合的簡單迭代。

非泛型集合 - IEnumerator

支持對非泛型集合的簡單迭代。

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

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

Cluster closestCluster = clusters.firstOrDefault();

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

在內部, foreach通過IEnumerable<Cluster>接口訪問迭代器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM