Я хочу построить страницу, которая будет автоматически печатать PDF-документ. Например, я могу вызвать mypage.html? Doc = my.pdf, и он напечатает файл my.pdf. while (reader! = null && reader.Read ()) //...
part кода:
Dictionary<Calculation, List<PropertyValue>> result = new Dictionary<Calculation, List<PropertyValue>>();
while (reader != null && reader.Read()) //it loops about 60000, and it will be bigger
{
#region create calc and propvalue variables
//...
#endregion
//this FirstOrDefault needs a lot of time
tmpElementOfResult = result.Keys.FirstOrDefault(r => r.InnerID == calc.InnerID);
if (tmpElementOfResult == null)
{
result.Add(calc, new List<PropertyValue> { propValue });
}
else
{
result[tmpElementOfResult].Add(propValue);
}
}
Не могли бы вы дать мне некоторое представление о том, как сделать это быстрее, потому что теперь это примерно 25 секунд :(?
Похоже, вам следует иметь словарь типа calc.InnerID
, вместо Dictionary
. Таким образом, вы можете сделать поиск гораздо быстрее. Вам вообще нужно хранить сам Calc
или вас интересует только ID?
Например:
Dictionary<Guid, List<PropertyValue>> result =
new Dictionary<Guid, List<PropertyValue>>();
while (reader.Read())
{
// Work out calc
List<PropertyValue> list;
if (!result.TryGetValue(calc.InnerID, out list))
{
list = new List<PropertyValue>();
result[calc.InnerID] = list;
}
list.Add(propValue);
}
В качестве альтернативы, если вы можете преобразовать ридер в IEnumerable
можно использовать:
Lookup<Guid, PropertyValue> result = items.ToLookup(x => x.InnerID,
// Or however you get it...
x => x.PropertyValue);
EDIT: похоже, что два значения Calc должны считаться равными, если они имеют одинаковый InnerID
, верно? Поэтому переопределите Equals
и GetHashCode
в Calc
для ссылки на InnerID
. Затем вы можете просто использовать:
Lookup<Calc, PropertyValue> result = items.ToLookup(x => x,
// Or however you get it...
x => x.PropertyValue);
... или вы можете использовать код, подобный первому фрагменту, но с Dictionary
:
Dictionary<Calc, List<PropertyValue>> result =
new Dictionary<Calc, List<PropertyValue>>();
while (reader.Read())
{
// Work out calc
List<PropertyValue> list;
if (!result.TryGetValue(calc, out list))
{
list = new List<PropertyValue>();
result[calc] = list;
}
list.Add(propValue);
}
вместо
tmpElementOfResult = result.Keys.FirstOrDefault(r => r.InnerID == calc.InnerID);
используйте
result.ContainsKey(calc.InnerId);
, чтобы проверить наличие ключа.
Можно ли сделать что-то вроде этого:
lookUpForResult = result.ToLookup(x => x.Key.InnerID, x => x.Value);
if (lookUpForResult.Contains(calc.InnerID))
{
result.Add(calc, new List<PropertyValue> { propValue });
}
else
{
(lookUpForResult[calc.InnerID]).Add(propValue);
}