2015-09-02 2 views
-1
private void getOrders() 
{ 
    try 
    { 
     //headerFileReader is assigned with a CSV file (not shown here). 
     while (!headerFileReader.EndOfStream) 
     { 
      headerRow = headerFileReader.ReadLine(); 
      getOrderItems(headerRow.Substring(0,8)) 
     } 
    } 
} 

private void getOrderItems(string ordNum) 
{ 
    // lines is an array assigned with a CSV file...not shown here. 
    var sorted = lines.Skip(1).Select(line => 
     new 
     { 
      SortKey = (line.Split(delimiter)[1]), 
      Line = line 
     }) 
     .OrderBy(x => x.SortKey) 
     .Where(x => x.SortKey == ordNum); 

    //Note ordNum is different every time when it is passed. 
    foreach (var orderItems in sorted) { 
     //Process each line here. 
    } 
} 

Выше мой код. Что я делаю для каждого номера заказа из headerFile, я обрабатываю detailLines. Я хотел бы искать только те строки, которые относятся к порядку nr. Вышеупомянутая логика отлично работает, но она считывает с предложением where для каждого номера заказа, который просто не требуется, а также задерживает процесс.C# linq список с изменением где условия

В основном я хочу, чтобы getOrderItems что-то вроде ниже, но я не могу получить, так как сортировка не может быть передана, но я думаю, что это должно быть возможно ??

private void getOrderItems(string ordNum) 
{ 
    // I would like to have sorted uploaded with data elsewhere and I pass it this function and reference it by other means but I am not able to get it. 

    var newSorted = sorted.Where(x => x.SortKey == docNum); 
    foreach (var orderItems in newSorted) { 
     //Process each line here. 
    } 
} 

Просьба предложить.

UPDATE: Спасибо за ответы & улучшения, но мой главный вопрос, я не хочу, чтобы создать список каждый раз, когда (как я показал в моем коде). Я хочу создать список в первый раз, а затем только поиск в списке для определенного значения (здесь docNum, как показано). Пожалуйста, предложите.

+0

Что вы имеете в виду * отсортированный не могут быть переданы *? –

+0

Почему бы не использовать 'Where' сначала, а затем' OrderBy'? будет намного более эффективным. –

+1

'.OrderBy (x => x.SortKey)' не имеет никакого смысла, если все ваши элементы имеют одинаковый 'SortKey' (т.е. равный' ordNum'). – Groo

ответ

1

Возможно, было бы целесообразно предварительно обработать ваши строки ввода и построить словарь, в котором каждый отдельный ключ сортировки сопоставляется с списком строк. Построение словаря является O(n), и после этого вы получите постоянные времени O(1) Lookups:

// these are your unprocessed file lines 
private string[] lines; 

// this dictionary will map each `string` key to a `List<string>` 
private Dictionary<string, List<string>> groupedLines; 

// this is the method where you are loading your files (you didn't include it) 
void PreprocessInputData() 
{ 
    // you already have this part somewhere 
    lines = LoadLinesFromCsv(); 

    // after loading, group the lines by `line.Split(delimiter)[1]` 
    groupedLines = lines 
     .Skip(1) 
     .GroupBy(line => line.Split(delimiter)[1]) 
     .ToDictionary(x => x.Key, x => x.ToList()); 
} 

private void ProcessOrders() 
{ 
    while (!headerFileReader.EndOfStream) 
    { 
     var headerRow = headerFileReader.ReadLine(); 
     List<string> itemsToProcess = null; 
     if (groupedLines.TryGetValue(headerRow, out itemsToProcess)) 
     { 
      // if you are here, then 
      // itemsToProcess contains all lines where 
      // (line.Split(delimiter)[1]) == headerRow 
     } 
     else 
     { 
      // no such key in the dictionary 
     } 
    } 
} 
+0

Спасибо за ответ .. Я обновил свое сообщение .. Пожалуйста, дайте мне знать ваши отзывы. – Anirudh

+0

@ Анируд: Я считаю, что этот ответ должен быть тем, что вам нужно; Словарь groupedLines' должен быть создан только один раз, когда вы загружаете «строки» из вашего файла 'csv'. Всякий раз, когда вы вызываете «TryGetValue» в этом экземпляре, вы получите список всех строк, которые соответствуют этому ключу (и это происходит очень быстро, так как это просто переход к ведро хэш-таблицы). Чтобы сделать его более ясным, я могу сделать поле groupedLines. – Groo

+0

Спасибо и все сработало .. – Anirudh

1

Следующее пойдет по пути, а также будет более эффективным.

var sorted = lines.Skip(1) 
    .Where(line => (line.Split(delimiter)[1] == ordNum)) 
    .Select(
     line => 
      new 
      { 
       SortKey = (line.Split(delimiter)[1]), 
       Line = line 
      } 
    ) 
    .OrderBy(x => x.SortKey); 
+0

Спасибо за ответ .. Я обновил свое сообщение .. Пожалуйста, дайте мне знать ваши отзывы. – Anirudh

Смежные вопросы