Быстро или кратко определите самую длинную строку на столбец в сборе данных на основе строк - PullRequest
2 голосов
/ 04 мая 2010

Судя по результату моего последнего запроса , мне нужно вычислить и задать ширину набора столбцов в таблице, которая превращается в файл Excel. К сожалению, строковые данные хранятся в формате на основе строк, но ширина должна быть рассчитана в формате на основе столбцов. Данные для электронных таблиц генерируются из следующих двух коллекций:

var dictFiles = l.Items.Cast<SPListItem>().GroupBy(foo => foo.GetSafeSPValue("Category")).ToDictionary(bar => bar.Key);
StringDictionary dictCols = GetColumnsForItem(l.Title);

Где l - это SPList, заголовок которого определяет, какие столбцы используются. Каждый SPListItem соответствует строке данных, которые сортируются в отдельные таблицы на основе категории (отсюда и словарь). Вторая строка - это просто StringDictionary, который имеет имя столбца (A, B, C и т. Д.) В качестве ключа и соответствующее отображаемое имя поля SPListItme в качестве соответствующего значения. Поэтому для каждой категории я перечисляю через dictFiles[somekey], чтобы получить все строки на этом листе, и получаю данные конкретной ячейки, используя SPListItem.Fields[dictCols[colName]].

Я спрашиваю: есть ли быстрый или краткий метод для любого dictFiles[somekey], чтобы получить считывание самой длинной строки в каждом столбце, предоставленном dictCols? Если невозможно получить как скорость, так и краткость, я могу согласиться с любым из них (поскольку у меня всегда есть маршрут O (n * m) для простого перечисления коллекции и обновления массива всякий раз, когда strCurrent.Length> strLongest.Length). Например, предположим, что у меня был набор из 3 элементов, а dictCols указал поля Field1, Field2 и Field3. Таблица целей может выглядеть следующим образом:

Item#  Field1     Field2     Field3
1      Oarfish    Atmosphere Pretty
2      Raven      Radiation  Adorable
3      Sunflower  Flowers    Cute

Я бы хотел функцию, которая могла бы чисто взять набор элементов 1, 2 и 3 и вывести их в правильном порядке ...

Sunflower, Atmosphere, Adorable

Использование .NET 3.5 и C # 3.0.

1 Ответ

1 голос
/ 04 мая 2010

К сожалению, поиск элемента с наибольшим значением для указанной наблюдаемой для набора из n элементов означает, что каждый элемент должен быть проверен. Таким образом, сложность O (n). Это действует, если не сделано никаких предположений по заказу коллекции.

Имея m коллекций для сканирования, сложность (как вы уже поняли) составляет O (m x n).


РЕДАКТИРОВАТЬ [Эрик Буриго] : Эта часть ответа была удалена, поскольку она не отвечала потребностям вопроса. [omissis]


После неправильного понимания вопроса я наконец понял суть. Я не вижу более компактного и элегантного синтаксиса, чем тот, который я предлагаю ниже.

  var collection =
      new List<Dictionary<String, String>>
      {
          new Dictionary<string, string> {{"Field1", "Oarfish"}, {"Field2", "Atmosphere"}, {"Field3", "Pretty"}},
          new Dictionary<string, string> {{"Field1", "Raven"}, {"Field2", "Radiation"}, {"Field3", "Adorable"}},
          new Dictionary<string, string> {{"Field1", "Sunflower"}, {"Field2", "Flowers"}, {"Field3", "Cute"}}
     };

 var fields = new[] {"Field1", "Field2", "Field3"};

 var maximums = new List<String>(fields.Length);
 foreach (var field in fields)
 {
      maximums.Add(Field(collection, field).OrderByDescending(fieldItem => fieldItem.Length).First());
 }

, где

  static IEnumerable<String> Field(IEnumerable<Dictionary<String, String>> collection, String field)
  {
      foreach (var row in collection)
      {
          yield return row[field];
      }
  }

Ретрансляция списка . Это решение требует, чтобы количество полей различных строк не менялось от строки к строке (но, похоже, это так).

Однако использование аккумулятора и вызванного метода не совсем компактно. Что вам действительно нужно, так это упрощенный способ транспонирования вашей структуры данных, чтобы вычислить самую длинную строку для каждого поля. Насколько я знаю, в фреймворке нет ярлыка для этого, поэтому результирующий метод (Field(...)) будет адаптирован к вашей конкретной структуре данных (набор строк с индексированными строками).

Таким образом, метод Field(...) может быть еще более усовершенствован, если он предоставит самую длинную строку, что сократит общий оператор вызова. Итак, чем больше работы мы вкладываем в этот конкретный метод, тем больше решение подходит к тому, что вы уже имели в виду до публикации вопроса.

РЕДАКТИРОВАТЬ [Эрик Буриго] : изменено, чтобы сделать коллекцию более похожей на ту, которая была опубликована в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...