РЕДАКТИРОВАТЬ: Хорошо, теперь, когда я запустил код, я думаю, что это проблема:
foreach (KeyValuePair<KeyValuePair<int, int>, int> CurrentRelation in
Reader.CurrentRelations)
{
ReadedRelations.Add(new KeyValuePair<int, int>(CurrentRelation.Key.Key,
CurrentRelation.Key.Value), CurrentRelation.Value);
}
Без этого цикла он работает намного быстрее ... что заставляет меня заподозрить, что тот факт, что вы читаете из XML, фактически является красной сельдью.
Я подозреваю, что проблема в том, что KeyValuePair<,>
не переопределяет Equals
и GetHashCode
. Я считаю, что если вы создадите свой собственный тип значений RelationKey
, содержащий два значения int
и переопределяющие GetHashCode
и Equals
(и реализующие IEquatable<RelationKey>
), это будет намного быстрее.
В качестве альтернативы, вы всегда можете использовать long
для хранения двух int
значений - что-то вроде хака, но это будет работать довольно хорошо. Я не могу проверить это сейчас, но я попробую, когда у меня будет больше времени.
Даже просто изменив ваш цикл на:
foreach (var relation in Reader.CurrentRelations)
{
ReadedRelations.Add(relation.Key, relation.Value);
}
будет проще и немного эффективнее ...
РЕДАКТИРОВАТЬ: Вот пример для RelationKey
структуры. Просто замените все вхождения KeyValuePair<int, int>
на RelationKey
и используйте свойства Source
и Target
вместо Key
и Value
:
public struct RelationKey : IEquatable<RelationKey>
{
private readonly int source;
private readonly int target;
public int Source { get { return source; } }
public int Target { get { return target; } }
public RelationKey(int source, int target)
{
this.source = source;
this.target = target;
}
public override bool Equals(object obj)
{
if (!(obj is RelationKey))
{
return false;
}
return Equals((RelationKey)obj);
}
public override int GetHashCode()
{
return source * 31 + target;
}
public bool Equals(RelationKey other)
{
return source == other.source && target == other.target;
}
}