Здравствуйте, vorona, Вы писали:
V>На собеседовании попросили написать Linq запрос, выбирающий самую длинную непрерывную последовательность.
V>У меня получилось так:
V>V>using System;
V>using System.Linq;
V>static class Program
V>{
V> static void Main(string[] args)
V> {
V> Object[] s = { "w", "a", "a", "b", "b", "b", "f", "a", "w", "w", "a", "b" };
V> var result = s.Select((k, i) => new { k, i }).GroupBy(p => p.k, p => p.i).SelectMany(g => g.Select((i, j) => new { k = g.Key, c = i - j }))
V> .GroupBy(p => new { p.k, p.c }, p => p.k, (k, e) => new { k = k.k, c = e.Count() }).Aggregate((p1, p2) => p1.c > p2.c ? p1 : p2);
V> Console.WriteLine(String.Format("{0} встречается - {1} раз", result.k, result.c));
V> }
V>}
V>
V>Может кто знает способ попроще.
Я вот такой придумал, не думаю, что он сильно правильнее:
var symbols = new[] { "w", "a", "a", "b", "b", "b", "f", "a", "w", "w", "a", "b", "b", "b" };
var max_count_item = new int[symbols.Length]
.Select((w, index) => symbols.Skip(index)).
Select(w => new
{
Item = w.FirstOrDefault(),
ItemsAfterCount = w.TakeWhile(w2 => w2 == w.FirstOrDefault()).Count()
}).OrderByDescending(w => w.ItemsAfterCount).
Select(w =>
new { Count = w.ItemsAfterCount, Item = w.Item }).First();
Console.WriteLine(String.Format("{0} встречается - {1} раз", max_count_item.Item, max_count_item.Count));
Вам бы посоветовал на собедесованиях не использовать переменные в один символ