World of Web

Kurztutorials

Foreach vs. ToList()

by on Okt.05, 2010, under Kurztutorials

Problematik

Problem: Ein Array soll zu einer Liste werden.

Lösungen:

  1. Foreach
  2. ToList()-Extension

Der Vergleich der beiden Varianten:

Vergleich Foreach vs ToList - Hohe Werte

Foreach vs. ToList - Hohe Werte

Foreach vs. ToList - niedrige Werte

Foreach vs. ToList - niedrige Werte

x-Achse: Anzahl der Elemente

y-Achse: Zeit in ms

Codebeispiel

Der Code mit dem die Statistik erstellt wurde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
List<TimeSpan> timeForeach = new List<TimeSpan>();
List<TimeSpan> timeToList = new List<TimeSpan>();
List<string> collection = new List<string>();
for (int j = 100; j < 20000000; j*=2)
{
   Guid[] guidList = new Guid[j];
   DateTime start = DateTime.Now;
   for (int i = 0; i < guidList.Length; i++)
   {
      guidList[i] = Guid.NewGuid();
   }
   DateTime end = DateTime.Now;
   TimeSpan diffGen = end - start;
   List<Guid> guidListForeach = new List<Guid>();
   start = DateTime.Now;
   foreach (Guid g in guidList)
   {
      guidListForeach.Add(g);
   }
   end = DateTime.Now;
   TimeSpan diffForeach = end - start;
   timeForeach.Add(diffForeach);
   List<Guid> guidListToList = new List<Guid>();
   start = DateTime.Now;
   guidListToList = guidList.ToList<Guid>();
   end = DateTime.Now;
   TimeSpan diffToList = end - start;
   timeToList.Add(diffToList);
}
Console.WriteLine("Average Foreach \t {0} ms", timeForeach.Average(=> s.TotalMilliseconds));
Console.WriteLine("Average ToList \t {0} ms", timeToList.Average(=> s.TotalMilliseconds));

Fazit

Bei einer hohen Anzahl von Werten in einem Array ist die ToList-Extension schneller als die Foreach-Variante. Bei wenigen Werten ist die Foreach-Lösung performanter.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Post to Twitter Post to Plurk Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to MySpace Post to Ping.fm Post to Reddit Post to StumbleUpon

2 Comments more...

Speichern und Laden der Expansion-States eines TreeViews

by on Okt.05, 2010, under Kurztutorials

Da uns das Standard Tree-View Control der WinForms keine Methode zur Verfügung stellt, die Expansion-States zu speichern und später wieder zu laden, wird in diesem Tutorial eine recht einfache Variante erarbeitet, welche genau zu diesem Ziel führen wird.

Grund-Überlegung

Die Baumknoten, die expandiert sind, werden in eine Liste hinzugefügt und beim Laden wird dann überprüft, ob sich der momentane Knoten in der Liste befindet oder nicht.

Deklaration der Liste

1
private List<TreeNode> expandedNodeList = new List<TreeNode>();

Es wird eine leere Liste aus TreeNodes erstellt, mit der dann später gearbeitet werden kann.

Speicher-Funktion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void saveExpandStates(TreeNode tn)
{
   if (tn.IsExpanded)
   {
      expandedNodeList.Add(tn);
      if (tn.Nodes.Count > 0)
      {
         foreach (TreeNode t in tn.Nodes)
            saveExpandStates(t);
      }
      else
         return;
   }
   else
      return;
}
Leave a Comment more...

Tages differenz berechnen

by on Okt.01, 2010, under Kurztutorials

Nehmen wir an, wir müssten aus den Zwei Daten 20081212 und 20090224 die Differenz der Tage bilden.

20081212 repräsentiert hierbei den 12.12.2008 und 20090224 den 24.02.2009.

Funktion zum splitten des Datums

Zunächst einmal brauchen wir Funktionen, die uns aus den gegebenen Integer-Variablen das Jahr, den Monat und die Tage „filtert“.

Meine Version dieser Funktionen sieht so aus:

public static int getYear(int date)
{
   int year = date / 10000;
   return year;
}
 
public static int getMonth(int date)
{
   string sDate = Convert.ToString(date);
   sDate = sDate.Substring(4, 2);
   int iDate = Convert.ToInt32(sDate);
   return iDate;
}
 
public static int getDay(int date)
{
   string sDate = Convert.ToString(date);
   sDate = sDate.Substring(6, 2);
   int iDate = Convert.ToInt32(sDate);
   return iDate;
}

Das Jahr wird berechnet, indem man die Zahl einfach durch 10.000 teilt. Da beim Variablen-Typ Integer immer eine Ganzzahldivision ausgeführt wird, werden die Dezimalstellen einfach weggestrichen.

Bei der Monat und Tage Berechnung funktioniert dieser Trick leider nicht.

1 Comment more...