Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Можно ли с помощью LINQ преобразовать  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Dima T
iskatelsql
Petro123
public static class

внутри
Shocker.Pro
IEnumerable<T> и методы расширения. Напиши свой.

И ты уже не пользователь LINQ, а можно сказать соавтор

+1)
10 ноя 18, 09:52    [21730321]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var _array = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

            var result = _array.Select((val, ind) => new { v = val, i = ind }).GroupBy(x => x.i / 3);
        }
    }
}
12 ноя 18, 10:20    [21731448]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145678
Агнец за бортом,

Однако тут не массив массивов, а массив анонимных классов
13 ноя 18, 19:52    [21733534]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
Cat2,

Ну вот, теперь к Select-у поставь себе в план и GroupBy к изучению.
13 ноя 18, 23:10    [21733643]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать / разбить массив на массивы "по три"?  [new]
fkthat
Member

Откуда:
Сообщений: 1754
int[] range = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var result = range
    .Select((item, index) => new { item, index })
    .GroupBy(x => x.index / 3)
    .Select(x => x.Select(y => y.item).ToArray())
    .ToArray();
20 ноя 18, 09:47    [21738744]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать / разбить массив на массивы "по три"?  [new]
Dima T
Member

Откуда:
Сообщений: 14328
static class Program    {

	public static IEnumerable<int[]> By3 (this int[] a){
		for(int i = 0; i < a.Length; i += 3) {
			var r = new int[a.Length - i > 3 ? 3 : a.Length - i];
			r[0] = a[i];
			if(i+1 < a.Length) r[1] = a[i+1];
			if(i+2 < a.Length) r[2] = a[i+2];
			yield return r;
		}
	}

	static void Main(string[] args)
	{
		var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		foreach(var a in arr.By3()) {
			foreach(var i in a) Console.Write(i + " ");
			Console.WriteLine("");
		}
	}
}
20 ноя 18, 10:42    [21738795]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3643
закину свои 5 копеек :)
class Program
{
    static void Main(string[] args)
    {
        IEnumerable<int> sourceEnumerable = Enumerable.Range(0, 86);
        IEnumerable<IEnumerable<int>> split = sourceEnumerable.Splite(5);
        foreach (IEnumerable<int> bucket in split)
        {
            Console.Write("{ ");
            foreach (int i in bucket)
            {
                Console.Write($"{i:000} ");
            }
            Console.WriteLine("}");
        }
        Console.ReadKey();
    }
}

public static class EnumerableSplitter
{
    /// <summary> Разбивает перечисление на перечисления меньшего размера и возвращает пачками\корзина </summary>
    /// <param name="source">Исходное перечисление</param>
    /// <param name="bucketCapacity">Размер пачки\корзины</param>
    /// <returns>Перечисления пачек\корзин</returns>
    public static IEnumerable<IEnumerable<T>> Splite<T>(this IEnumerable<T> source, int bucketCapacity)
    {
        if (bucketCapacity < 1) throw new ArgumentOutOfRangeException(nameof(bucketCapacity));

        using (IEnumerator<T> enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                yield return GetBucket(enumerator, bucketCapacity);
            }
        }
    }

    private static IEnumerable<T> GetBucket<T>(IEnumerator<T> enumerator, int bucketCapacity)
    {
        int count = 0;
        do
        {
            yield return enumerator.Current;
        }
        while (++count < bucketCapacity && enumerator.MoveNext());
    }
}
20 ноя 18, 12:08    [21738901]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
iskatelsql
но заманчиво написать это одной строкой на LINQ,


Картинка с другого сайта.
20 ноя 18, 12:15    [21738916]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Агнец за бортом
iskatelsql
но заманчиво написать это одной строкой на LINQ,


Картинка с другого сайта.

))
Для глупых задачек "поделить все на три" нету linq в одну строку.
20 ноя 18, 12:21    [21738928]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
смешно им, прост я привык хорошему...

на питоне это было бы

l = [1,2,3,4,5,6,7,8,9]

res = zip(*[iter(l)] * 3)
20 ноя 18, 12:50    [21738985]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21167
iskatelsql
смешно им, прост я привык хорошему...
Тебе предложили несколько вариантов именно на Linq и именно в одну строку. Чем ты остался недоволен?
20 ноя 18, 12:56    [21738996]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
Shocker.Pro
Чем ты остался недоволен?


Кто сказал что я недоволен? Я так, пофлудить за компанию.
20 ноя 18, 12:57    [21738997]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21167
К примеру, вот задачка, которая решается на Linq в одну строку
"Дан текст - слова из строчных английских букв. Напечатать все согласные буквы, которые входят только в одно слово."
На питоне получится?
20 ноя 18, 12:58    [21738998]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21167
iskatelsql
Я так, пофлудить за компанию.
ты - ТС, не получится пофлудить за компанию )
20 ноя 18, 12:59    [21739000]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
Shocker.Pro
"Дан текст - слова из строчных английских букв. Напечатать все согласные буквы, которые входят только в одно слово."


эээ, после запятой не понял...

и у меня с циферками в основном все связано. с текстом побуквенно и не приходилось никогда, так что незнаю.
20 ноя 18, 13:02    [21739011]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21167
iskatelsql
эээ, после запятой не понял...
в предложении несколько слов. Есть буквы, которые встречаются только в одном из этих слов.

iskatelsql
и у меня с циферками в основном все связано. с текстом побуквенно и не приходилось никогда, так что незнаю.
А в чем разница между массивом целых чисел и массивом целых чисел, которые представляют собой коды букв?
20 ноя 18, 13:05    [21739017]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
iskatelsql
смешно им, прост я привык хорошему...
тогда придума1 более жизненные задачи.
Чем "А и Б сидели на трубе".
20 ноя 18, 13:07    [21739019]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
Petro123
тогда придума1 более жизненные задачи.

Ну это очень жизненная задача, каждый раз рисуя очередную ф-цию не отпускает ощющение что я делаю все зря, а вопрос можно решить одной хитрой строчкой...


Shocker.Pro,

да фиг его знает, прост неестественность задачи смущает. студентов подобным гоняют, но в жизни я себе слабо представляю зачем стоит искать согласную букву...
20 ноя 18, 13:14    [21739025]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
Petro123
Для глупых задачек "поделить все на три" нету linq в одну строку.


Во первых - есть.
Во вторых - что хвостовские замашки?

iskatelsql

res = zip(*[iter(l)] * 3)




Нефига-се к "хорошему". Это весь питон такой?
20 ноя 18, 13:24    [21739040]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3643
какой сакральный смысл писать код в 1 строку?
качество читаемости это не дает, производительности это, как правило, не дает, а может даже на оборот, размер файла уменьшается, но если следовать принципам Solid то он и без этого большим не будет.
я не агитирую, но мне бы хотелось понять, почему автор считает, что писать в 1 строку, это хорошо, а в 20 строк, это плохо?
с точки зрения вызова, на много будет понятнее, если будет написано

Массивы = РазбейМнеМассив(исходныйМассив, по 10 штук);
чем:
Массивы = СкройАнонимныйТип(СгруппируйЭлементыПоИндексу(ВерниЭлементыСИндексом(Исходный массив), по 10 штук))
или цепочкой
Массивы = исходныйМассив.ВерниЭлементыСИндексом.СгруппироуйЭлементы.СкройАнонимныйТип .
При этом где основной аргумент "По 10 штук"? он где то внутри выражения группировки...

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

Если вы написали класс который решает вашу задачу, то вызов метода из этого класса будет меньше, лаконичнее и понятнее, чем цепочка Linq вызовов, которая сама по себе не как не отражает те данные, которые должна вернуть и мне как человеку незнакомому с вашим кодом придется поработать головой, чтоб понять, что вообще происходит. Сама реализация этого класса может быть на чем угодно, хоть на том же Linq. И переделать этот код будет значительно проще.
20 ноя 18, 13:26    [21739043]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Агнец за бортом
Во вторых - что хвостовские замашки?
не дай бог нам быть тут одинаковыми).
20 ноя 18, 13:30    [21739048]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
Roman Mejtes
но мне бы хотелось понять, почему автор считает,


В - выразительность.
20 ноя 18, 13:35    [21739055]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
Roman Mejtes
, лаконичнее и понятнее, чем цепочка Linq вызовов,

Мало практики.

Roman Mejtes
придется поработать головой,

Вообще не лишне.


Roman Mejtes
И переделать этот код будет значительно проще.

Пишите, чтоб не переделывать. Что за мания, переделывать и переопределять?
20 ноя 18, 13:36    [21739057]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
iskatelsql
Ну это очень жизненная задача, каждый раз рисуя очередную ф-цию
обчно программист на ранг выше и ниже смотрит.
Обычно такие задачи это нижний системный уровень
iskatelsql
Вобщем не суть, главное чтоб разбить массив по тройкам.

Т.е. linq не применяют, а ты его в тему вставил.
20 ноя 18, 13:41    [21739065]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
Petro123
Т.е. linq не применяют, а ты его в тему вставил.


Вставил по двум причинам.

1 мне показалось что кроме как на нем это одной строчкой не сделать
2 я только изучаю, и примеры, которые ближе к моим задачам не лишние
20 ноя 18, 13:56    [21739097]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить