浏览代码

Merge pull request #610 from jskeet/fix-enumerator

Remove the struct-based iterator for RepeatedField.
Jon Skeet 10 年之前
父节点
当前提交
7ea5239792

+ 0 - 6
csharp/src/ProtocolBuffers.Test/Collections/RepeatedFieldTest.cs

@@ -241,18 +241,12 @@ namespace Google.Protobuf.Collections
             var list = new RepeatedField<string> { "first", "second" };
             using (var enumerator = list.GetEnumerator())
             {
-                Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
                 Assert.IsTrue(enumerator.MoveNext());
                 Assert.AreEqual("first", enumerator.Current);
                 Assert.IsTrue(enumerator.MoveNext());
                 Assert.AreEqual("second", enumerator.Current);
                 Assert.IsFalse(enumerator.MoveNext());
-                Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
                 Assert.IsFalse(enumerator.MoveNext());
-                enumerator.Reset();
-                Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
-                Assert.IsTrue(enumerator.MoveNext());
-                Assert.AreEqual("first", enumerator.Current);
             }
         }
 

+ 6 - 57
csharp/src/ProtocolBuffers/Collections/RepeatedField.cs

@@ -288,14 +288,12 @@ namespace Google.Protobuf.Collections
             }
         }
 
-        public RepeatedField<T>.Enumerator GetEnumerator()
+        public IEnumerator<T> GetEnumerator()
         {
-            return new Enumerator(this);
-        }
-
-        IEnumerator<T> IEnumerable<T>.GetEnumerator()
-        {
-            return GetEnumerator();
+            for (int i = 0; i < count; i++)
+            {
+                yield return array[i];
+            }
         }
 
         public override bool Equals(object obj)
@@ -467,55 +465,6 @@ namespace Google.Protobuf.Collections
             }
             Remove((T)value);
         }
-        #endregion
-
-        public struct Enumerator : IEnumerator<T>
-        {
-            private int index;
-            private readonly RepeatedField<T> field;
-
-            public Enumerator(RepeatedField<T> field)
-            {
-                this.field = field;
-                this.index = -1;
-            }
-
-            public bool MoveNext()
-            {
-                if (index + 1 >= field.Count)
-                {
-                    index = field.Count;
-                    return false;
-                }
-                index++;
-                return true;
-            }
-
-            public void Reset()
-            {
-                index = -1;
-            }
-
-            public T Current
-            {
-                get
-                {
-                    if (index == -1 || index >= field.count)
-                    {
-                        throw new InvalidOperationException();
-                    }
-                    return field.array[index];
-                }
-            }
-
-            object IEnumerator.Current
-            {
-                get { return Current; }
-            }
-
-            public void Dispose()
-            {
-            }
-        }
+        #endregion        
     }
 }