К сожалению, поиск элемента с наибольшим значением для указанной наблюдаемой для набора из 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(...)
может быть еще более усовершенствован, если он предоставит самую длинную строку, что сократит общий оператор вызова. Итак, чем больше работы мы вкладываем в этот конкретный метод, тем больше решение подходит к тому, что вы уже имели в виду до публикации вопроса.
РЕДАКТИРОВАТЬ [Эрик Буриго] : изменено, чтобы сделать коллекцию более похожей на ту, которая была опубликована в вопросе.