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

Откуда: г. Пермь
Сообщений: 3605
Shocker.Pro
iskatelsql
кстати, Length чтоль использовать?
Ты осознаешь, что Length - это просто свойство, которое можно просто прочитать, а Count() - это метод, который получит энумератор и переберет через него все ячейки массива, чтобы узнать количество элементов, которое и так лежит в Length?

Конечно, многие задачи не имеют критичности в производительности, но не до такой же степени!

Count() проверяет типы на ICollection<T>, IList<T> наследует ICollection<T>, по этому если делать для них, то так не будет работать, но к массивам это не относится
21 ноя 18, 22:42    [21740654]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3605
iskatelsql
Roman Mejtes, Shocker.Pro,


Если вы обратите внимание, это не мой код... я туда только *t добавил...

кстати, Length чтоль использовать? а это "Получите IEnumerable<IEnumerable<T>> и легко сможете получить IEnumerable<T[]> без всяких count()." я вообще не понял

Уже кидал пример:
class Program
{
    static void Main(string[] args)
    {
        IEnumerable<int> sourceEnumerable = Enumerable.Range(0, 86);
        IEnumerable<int[]> split = sourceEnumerable.Split(3).Select(p => p.ToArray());
        foreach (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>> Split<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());
    }
}
21 ноя 18, 22:46    [21740655]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать / разбить массив на массивы "по три"?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2421
iskatelsql
Догадывался, но конкретных подтверждений не видел, кто его знает как оно внутри устроено... Теперь будем знать

Нетрудно ж посмотреть исходники - https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,41ef9e39e54d0d0b
21 ноя 18, 22:52    [21740657]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

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

я к тому что эта Length вполне могла бы содержать тотже самый Count в get.
21 ноя 18, 22:56    [21740659]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21014
iskatelsql
я к тому что эта Length вполне могла бы содержать тотже самый Count в get.
Не могла. Очевидно, Linq появился в .Net гораздо позже, чем массивы. Ну и стоило бы понимать саму суть массивов.
21 ноя 18, 23:04    [21740669]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
Shocker.Pro,

я и не про Linq Count а про то что этот Length из себя представляет. некоторую переменную которая обновляется при всех операциях с массивом, замедляя эти операции, или всетаки пересчет элементов при обращении к свойству.

а если пересчет, то какая нафик разница Linq это пересчет или нет...
21 ноя 18, 23:08    [21740674]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать / разбить массив на массивы "по три"?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2421
iskatelsql,

Метод get свойства Array.Length имеет атрибут [MethodImpl(MethodImplOptions.InternalCall)]
https://referencesource.microsoft.com/#mscorlib/system/array.cs,42e9b7616956cf94

Т.е., вероятно, это свойство реализовано на уровне операционки, а значит, быстрей в дотнете все-равно никак не сделаешь...
21 ноя 18, 23:13    [21740677]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21014
iskatelsql
которая обновляется при всех операциях с массивом,
Это при каких же операциях она обновляется?
21 ноя 18, 23:15    [21740679]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать / разбить массив на массивы "по три"?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2421
Shocker.Pro
iskatelsql
которая обновляется при всех операциях с массивом,
Это при каких же операциях она обновляется?

Да, действительно))
21 ноя 18, 23:22    [21740683]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
Shocker.Pro
iskatelsql
которая обновляется при всех операциях с массивом,
Это при каких же операциях она обновляется?


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

я честн не заморачивался с этим, в моих нынешних задачах масивы пару сотен элементов, так что затраты времени на оптимизацию не окупятся. так, на будушее спросил
21 ноя 18, 23:23    [21740684]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3605
Shocker.Pro
iskatelsql
которая обновляется при всех операциях с массивом,
Это при каких же операциях она обновляется?

даже если речь идет про Count, получить значение поля, это не то же самое, что перечислить все элементы,
в первом случае сложность O(1), во втором O(n). Человек какую то хрень несет и не понятно, чего хочет, вариантов дали вагон и маленькую тележку
21 ноя 18, 23:24    [21740685]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
iskatelsql
Member

Откуда:
Сообщений: 799
Roman Mejtes
и не понятно, чего хочет


Странно у вас с пониманием... Я чего хотел давно получил, и проехал эту задачу. А вы тут все пишете, пишете, мне уведомления приходят, вот и я чтото пишу Картинка с другого сайта.
21 ноя 18, 23:26    [21740686]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

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

В Linq легко накосячить, устроив, например, цикл в цикле. Или замыкание на переменную цикла. Так что нужно четко понимать, что такое перечисление и как оно работает.
21 ноя 18, 23:27    [21740689]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21014
iskatelsql
мне уведомления приходят,
Отпишишь. Зайдешь через полгодика, перечитаешь 20 страниц и норм.
21 ноя 18, 23:28    [21740690]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать / разбить массив на массивы "по три"?  [new]
fkthat
Member

Откуда:
Сообщений: 1698
Shocker.Pro
m - это массив, не надо сувать Count(), где он не требуется


LINQ в этом плане оптимизирован - в своих потрохах он распознает что это массив и при вызове Count() не будет пересчитывать всю коллекцию, а сразу вызовет Length - сам проверял когда-то по исходникам.
22 ноя 18, 06:35    [21740749]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
fkthat
Shocker.Pro
m - это массив, не надо сувать Count(), где он не требуется


LINQ в этом плане оптимизирован - в своих потрохах он распознает что это массив и при вызове Count() не будет пересчитывать всю коллекцию, а сразу вызовет Length - сам проверял когда-то по исходникам.
это круто, но мое имхо в том, что не надо бы смешивать работу с массивами и коллекциями в один api.
Все таки не бейсик у нас.
22 ноя 18, 07:24    [21740760]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

Откуда:
Сообщений: 1318
Cat2
Однако не выдает то, что надо. В первом измерении уже 4 каких-то объекта.


Каких-то объекта! Картинка с другого сайта.

Итак (крещендо), четыре каких-то объекта:

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

Cat2
Что мне еще местный гурии посоветую изучить?

Вот это деловой разговор.
Select и GroupBy уже осилены?
22 ноя 18, 09:53    [21740854]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145676
Агнец за бортом
Вот это деловой разговор.
Select и GroupBy уже осилены?

Нет пока. Я по алфавиту иду. Начал изучать Aggregate
22 ноя 18, 17:45    [21741765]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145676
Агнец за бортом
Каких-то объекта! Картинка с другого сайта.

Итак (крещендо), четыре каких-то объекта:

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


Пианиссимо, однако

4 и 5 в объекте first
6 - в объекте second. Добраться до них непросто

К сообщению приложен файл. Размер - 45Kb
22 ноя 18, 18:14    [21741825]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145676
iskatelsql
Cat2,

result1 {1,2,3}{2,3,4}{3,4,5}

Вот это по нашему, по-пацански!
22 ноя 18, 18:21    [21741844]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

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

Обыкновенный функциональный подход.

С GroupBy самый изящный способ.
22 ноя 18, 18:52    [21741916]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Cat2
Member

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

Обыкновенный функциональный подход.

С GroupBy самый изящный способ.

Вы мне напишите как после этого подхода получит второй элемент первого массива, из вычисленного result
22 ноя 18, 19:07    [21741953]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли с помощью LINQ преобразовать  [new]
Агнец за бортом
Member

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

Обыкновенный функциональный подход.

С GroupBy самый изящный способ.

Вы мне напишите как после этого подхода получит второй элемент первого массива, из вычисленного result


Ты это... Серьезно? o_O
22 ноя 18, 19:27    [21741992]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4]      все
Все форумы / WinForms, .Net Framework Ответить