void run() { var byBuildingId = CreateTestBuildingsById(); // Create some test data. var byImprovementId = CreateImprovementsById(byBuildingId); // Create the alternative lookup dictionaries. var testTuples = CreateTestTuples(); ImprovementId improvementId = new ImprovementId(5010); int count = 10000; Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < count; ++i) { byImprovementId[improvementId].Sum(result => result.Value.Data); } Console.WriteLine("Dictionary of dictionaries took " + sw.Elapsed); sw.Restart(); for (int i = 0; i < count; ++i) { testTuples.Where(result => result.Key.Item2.Equals(improvementId)).Sum(item => item.Value.Data); } Console.WriteLine("Dictionary of tuples took " + sw.Elapsed); }
void run() { var byBuildingId = CreateTestBuildingsById(); // Create some test data. var byImprovementId = CreateImprovementsById(byBuildingId); // Create the alternative lookup dictionaries. // Aggregate data for all improvements for building with ID == 1500: BuildingId buildingId = new BuildingId(1500); var sum = byBuildingId[buildingId].Sum(result => result.Value.Data); Console.WriteLine(sum); // Aggregate data for all buildings with a given improvement. ImprovementId improvementId = new ImprovementId(5010); sum = byBuildingId.Sum(improvements => { Result result; return(improvements.Value.TryGetValue(improvementId, out result) ? result.Data : 0.0); }); Console.WriteLine(sum); // Aggregate data for all buildings with a given improvement using byImprovementId. // This will be much faster than the above Linq. sum = byImprovementId[improvementId].Sum(result => result.Value.Data); Console.WriteLine(sum); }