Сценарий автоматической печати PDF на php или javascript

Я хочу построить страницу, которая будет автоматически печатать 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 секунд :(?

1
задан John Saunders 25 August 2010 в 11:28
поделиться

3 ответа

Похоже, вам следует иметь словарь типа 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);
}
2
ответ дан 2 September 2019 в 21:52
поделиться

вместо

  tmpElementOfResult = result.Keys.FirstOrDefault(r => r.InnerID == calc.InnerID);

используйте

  result.ContainsKey(calc.InnerId);

, чтобы проверить наличие ключа.

0
ответ дан 2 September 2019 в 21:52
поделиться

Можно ли сделать что-то вроде этого:

                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);
                }
0
ответ дан 2 September 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: