문제

는 가장 좋은 방법은 무엇입을 반복하고 강력한 형식의 일반 목록 C#.NET 고 VB.NET?

도움이 되었습니까?

해결책

C#:

foreach(ObjectType objectItem in objectTypeList)
{
    // ...do some stuff
}

에 대한 답 VB.NET 서 퍼플 Ant:

For Each objectItem as ObjectType in objectTypeList
    'Do some stuff '
Next

다른 팁

모든 일반적인 구현페이 최선의 방법입니다:

//C#
foreach( var item in listVariable) {
    //do stuff
}

중요한 예외 그러나입니다.페이는 오버헤드가 현재()및 MoveNext()는 무엇 foreach 루프가 실제로 컴파일한다.

을 때 당신은 단순한 배열의 구조체:

//C#
int[] valueTypeArray;
for(int i=0; i < valueTypeArray.Length; ++i) {
     int item = valueTypeArray[i];
     //do stuff
}

은 더 빠르다.


업데이트

다음과 토론@스티븐 Sudit(주)나는 생각한 나의 원한 조언이 될 수 있는 날짜 또는 착각하는,그래서 나는 몇 가지 테스트:

// create a list to test with
var theList = Enumerable.Range(0, 100000000).ToList();

// time foreach
var sw = Stopwatch.StartNew();
foreach (var item in theList)
{
    int inLoop = item;
}
Console.WriteLine("list  foreach: " + sw.Elapsed.ToString());

sw.Reset();
sw.Start();

// time for
int cnt = theList.Count;
for (int i = 0; i < cnt; i++)
{
    int inLoop = theList[i];
}
Console.WriteLine("list  for    : " + sw.Elapsed.ToString());

// now run the same tests, but with an array
var theArray = theList.ToArray();

sw.Reset();
sw.Start();

foreach (var item in theArray)
{
    int inLoop = item;
}
Console.WriteLine("array foreach: " + sw.Elapsed.ToString());

sw.Reset();
sw.Start();

// time for
cnt = theArray.Length;
for (int i = 0; i < cnt; i++)
{
    int inLoop = theArray[i];
}
Console.WriteLine("array for    : " + sw.Elapsed.ToString());

Console.ReadKey();

그래서,저는 이것을 실행에서 방출된 모든이 완벽하게 작동합니다.:

list  foreach: 00:00:00.5137506
list  for    : 00:00:00.2417709
array foreach: 00:00:00.1085653
array for    : 00:00:00.0954890

고 그때 디버깅이 없이 완벽하게 작동합니다.:

list  foreach: 00:00:01.1289015
list  for    : 00:00:00.9945345
array foreach: 00:00:00.6405422
array for    : 00:00:00.4913245

그래서 나타나는 상당히 일치하 for 보다 빠르 foreach 와 배열을 보다 더 빨리 일반 목록입니다.

그러나,이러 100,000,000 반복하고 차이에 대해 .4 의 두 번째 사이에 가장 빠르고 가장 느린 방법이 있습니다.지 않는 한 당신이 하고 있는 대규모 성능이 중요한 루프지 않에 대해 걱정 가치가있다.

대 VB.NET:

For Each tmpObject as ObjectType in ObjectTypeList
    'Do some stuff '
Next

C#

myList<string>().ForEach(
    delegate(string name)
    {
        Console.WriteLine(name);
    });

익명의 대표는 현재 구현되지 않은 VB.Net 지만,C#고 VB.Net 을 할 수 있어야 한다 람다:

C#

myList<string>().ForEach(name => Console.WriteLine(name));

VB.Net

myList(Of String)().ForEach(Function(name) Console.WriteLine(name))

로 Grauenwolf 지적한 위의 VB 지 않을 컴파일하기 때문 람다하지 않고 값을 반환하지 않습니다.일반 ForEach 루프로 제안하는 가장 쉬운지만,평소와 같이 걸리는 블록의 코드는 무엇 C#할 수 있습니다.


여기에는 진부한 예제는 이유이 유용할 수 있습니다:이것은 당신의 능력을 전달하는 루프에서 논리에서 다른 범위보다는페이 존재하는,그래서 당신은 심지어는 노출하면 당신은 그것을 원하지 않는다.

말이 있는 목록의 상대 url 경로에 당신을 만들고 싶어 절대적인:

public IEnumerable<String> Paths(Func<String> formatter) {
    List<String> paths = new List<String>()
    {
        "/about", "/contact", "/services"
    };

    return paths.ForEach(formatter);
}

그래서 그 다음 당신을 부를 수 있는 기능을 이 방법:

var hostname = "myhost.com";
var formatter = f => String.Format("http://{0}{1}", hostname, f);
IEnumerable<String> absolutePaths = Paths(formatter);

당신 "http://myhost.com/about", "http://myhost.com/contact" etc.분명히 더 나은 이것을 달성하는 방법에서 이 specfic 를 들어 난 그냥 노력을 입증하는 기본 원칙으로 합니다.

을 모르면 내부의 구현은 목록이 생각,일반적으로 최고의 방법을 통해 반복하는 것 foreach 다.기 때문에 foreach 사용 IEnumerator 보 목록에,그것은 목록에 그 자체를 결정하는 방법에서 이동하는 물체를 개체입니다.

는 경우에는 내부 구현되었고,연결 목록,다음에 대한 간단한 루프에 가는 것보다 조금 느리게 작동하 foreach.

그 의미가 있습니까?

그 응용 프로그램에 따라 다릅:

  • 에 대한 반복,는 경우에 효율이 우선 순위
  • foreach 루프 또는 ForEach 방법 중,통신의 의도가 더 명확하게

내가 누락 될 수 있습니다 그러나 이러한 반복을 통해 일반 목록은 매우 간단해야 사용할 경우 내 예 아래입니다.목록<>클래스를 구현하는 명령과페 인터페이스를 쉽게 확인할 수 있습니다 반복하여 그들을 통해 기본적으로 어떤 방식으로 원합니다.

가장 효율적인 방법을 사용하는 것입니다 루:

for(int i = 0; i < genericList.Count; ++i) 
{
     // Loop body
}

당신이 선택할 수도 있습 foreach 루프를 사용하여:

foreach(<insertTypeHere> o in genericList)
{
    // Loop body
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top