2013-07-17 32 views
1

我有以下問題: 我有一個列表,並添加字符串項到此列表中。 然後我從列表中創建一個枚舉器。當我通過與MoveNext()命令列表循環,當我直接訪問枚舉它的工作原理。當我使用枚舉器屬性訪問枚舉器時,它不起作用。 MoveNext()命令不增加索引。C#列表和枚舉與性能

這是我使用的代碼。非常感謝你的幫助。

public class DummyKlasse 
{ 
    public List<string>.Enumerator enumerator; 
    public List<string> list; 

    public DummyKlasse() 
    { 
     Console.WriteLine("Test"); 
     list = new List<string>(); 
     enumerator = new List<string>.Enumerator(); 
    } 

    public List<string>.Enumerator Enumerator 
    { 
     get { return enumerator; } 
     set { enumerator = value;} 
    } 

    public List<string> List 
    { 
     get { return list; } 
     set { list = new List<string>(value); } 
    }   

    public void dummyfunction() 
    { 
     List.Add("test1"); 
     List.Add("test2"); 

     enumerator = List.GetEnumerator(); 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     DummyKlasse dummyklasse = new DummyKlasse(); 
     dummyklasse.dummyfunction(); 

     //Does not work with properties 
     /* 
     while (dummyklasse.Enumerator.MoveNext()) 
     { 
      Console.WriteLine(dummyklasse.Enumerator.Current); 
     } 
     */ 
     //Works WITHOUT properties 
     while (dummyklasse.enumerator.MoveNext()) 
     { 
      Console.WriteLine(dummyklasse.enumerator.Current); 
     } 

     Console.ReadLine(); 
    } 
} 
+1

究竟是什麼你的目標是什麼?大多數時候,一個簡單的'foreach'結構將允許你迭代你的數據。 –

+0

添加使用繼承的答案添加 –

回答

4

List<T>.Enumerator是一個結構,所以在你的while循環,每次訪問Enumerator屬性,您呼叫的getter方法,將返回每次枚舉的新副本。此枚舉將指向列表的日開始之前的項目,每次調用MoveNextCurrent將在該枚舉的不同副本來完成。

因此在非空列表中,MoveNext將始終返回true,並且Enumerator.Current始終爲空。

如果您直接訪問該字段,您將避免使用此副本,並調用MoveNextCurrent來訪問同一枚舉器。

如果你改變你的代碼:

using (var enumerator = dummyklasse.Enumerator) 
{ 
    while (enumerator.MoveNext()) 
    { 
     Console.WriteLine(enumerator.Current); 
    } 
} 

它會正常工作。請注意,這類似於foreach聲明做什麼。

+0

這是如何解決直接訪問OP示例中的字段但該屬性不可用的事實? – mao47

+1

@ mao47 - 如果您直接訪問該字段,則不會複製該字段。 – Lee

+0

由於某種原因,我仍然認爲它是一個變量,即使我*知道*它是一個值。結構可能會很棘手。 – mao47

0

爲什麼你想捕捉你的DummyKlasse一個枚舉?更好的是捕獲List(你正在做的),讓消費者擔心他們自己的統計員。這是最好的使用foreach循環的完成。

public class DummyKlasse 
{ 
    public List<string> List { get; set; } 

    public DummyKlasse() 
    { 
     List = new List<string>(); 
    } 

    public void Setup() 
    { 
     List.Add("one"); 
     List.Add("two"); 
    } 
} 

... 

var dummy = new DummyKlasse(); 
dummy.Setup(); 

// the client does his own enumerating, not dummy. 
foreach (var str in dummy.List) 
{ 
    Console.WriteLine(str); 
}