В случае, если вы не играете код головоломки с вашими коллегами, а просто хочет, чтобы создать новый массив с вашими критериями , Я бы не делал этого с запросами вообще, но использовал Array.copy.
Есть три различных случая:
- исходный массив имеет меньше чем 5 пунктов
- исходный массив имеет 5 до 9 пунктов
- исходный массив имеет 10 или больше деталей
Третий - это простой случай, поскольку первый и последний 5 элементов различны и четко определены.
Остальные два требуют больше размышлений.Я собираюсь принять вы хотите следующее: проверьте эти предположения:
Если исходный массив имеет менее 5 элементов, вам понадобится массив из элементов 2 * (длина массива), например [ 1, 2, 3] становится [1, 2, 3, 1, 2, 3]
Если исходный массив имеет от 5 до 9 элементов, вам понадобится массив из примерно 10 элементов, например [ 1, 2, 3, 4, 5, 6] становится [1, 2, 3, 4, 5, 2, 3, 4, 5, 6]
демонстрация программа
public static void Main()
{
Console.WriteLine(String.Join(", ", headandtail(new int[]{1, 2, 3})));
Console.WriteLine(String.Join(", ", headandtail(new int[]{1, 2, 3, 4, 5, 6})));
Console.WriteLine(String.Join(", ", headandtail(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11})));
}
private static T[] headandtail<T>(T[] src) {
int runlen = Math.Min(src.Length, 5);
T[] result = new T[2 * runlen];
Array.Copy(src, 0, result, 0, runlen);
Array.Copy(src, src.Length - runlen, result, result.Length - runlen, runlen);
return result;
}
, который работает в O (1);
Если вы : играйте в пазлы с вашими коллегами, ну и все самое интересное в головоломке, не так ли?
Это тривиально.
src.Take(5).Concat(src.Reverse().Take(5).Reverse()).ToArray();
Это работает в O (n).
Вы попробовали var result = someArray.Take (5) .Union (someArray.Skip (someArray.Count() - 5) .Take (5)); ? –
как насчет 'someArray.Take (5) .Concat (someArray.Reverse(). Take (5));'? – Nilesh
@MitatKoyuncu, 'Union' удаляет повторяющиеся записи, которые могут быть или не быть такими, какие вы хотите. Если вы определенно хотите получить 10 результатов, используйте 'Concat' –