Performance issue, be cautious to use List.Contains...
1. Big difference between having contains and not having, and no overriding in PerformanceInfo:
[10-05-03 11:32:25.740][Info]Program.TestCollection(): Cost 00:00:00.0312488 ([AppName:ConsoleTest.exe])
[10-05-03 11:32:59.004][Info]Program.TestCollection(): Cost 00:00:33.3737184 ([AppName:ConsoleTest.exe])
[10-05-03 11:32:59.035][Info]Program.TestCollection(): Cost 00:00:00.0312488 ([AppName:ConsoleTest.exe])
[10-05-03 11:32:59.082][Info]Program.TestCollection(): Cost 00:00:00.0468732 ([AppName:ConsoleTest.exe])
2. Try List.Distinct or use Dictionary if we want to check Contains...
Sample codes below:
static void Main(string[] args)
{
int count = 100000;
DateTime dt0 = DateTime.Now;
TestCollectionWithoutContains(count);
DateTime dt1 = DateTime.Now;
Log.Info("Cost "+ (dt1 - dt0));
TestCollectionUsingListContains(count/10);
DateTime dt2 = DateTime.Now;
Log.Info("Cost " + (dt2 - dt1));
TestCollectionUsingDicContains(count);
DateTime dt3 = DateTime.Now;
Log.Info("Cost " + (dt3 - dt2));
TestCollectionUsingListDistinct(count);
DateTime dt4 = DateTime.Now;
Log.Info("Cost " + (dt4 - dt3));
}
private static void TestCollectionUsingListDistinct(int count)
{
List<string> list = new List<string>();
for (int j = 0; j < count; j++)
{
string id = (j / 2).ToString();
list.Add(id);
}
List<string> list2 = new List<string>();
foreach (string pi in list.Distinct<string>())
{
list2.Add(pi);
}
}
private static void TestCollectionUsingListContains(int count)
{
List<string> list = new List<string>();
for (int j = 0; j < count; j++)
{
string id = (j/2).ToString();
if (!list.Contains(id))
{
list.Add(id);
}
}
}
private static void TestCollectionUsingDicContains(int count)
{
//List<PerformanceInfo> list = new List<PerformanceInfo>();
Dictionary<string, string> list = new Dictionary<string, string>();
for (int j = 0; j < count; j++)
{
string id = (j / 2).ToString();
if (!list.ContainsKey(id))
{
list.Add(id, j.ToString());
}
}
}
private static void TestCollectionWithoutContains(int count)
{
List<string> list = new List<string>();
for (int j = 0; j < count; j++)
{
string id = (j / 2).ToString();
list.Add(id);
}
}