는 가장 좋은 방법은 무엇입을 반복하고 강력한 형식의 일반 목록<T>?
-
08-06-2019 - |
문제
는 가장 좋은 방법은 무엇입을 반복하고 강력한 형식의 일반 목록 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
}