Самый прохладный прием C# LINQ/Lambdas Вы когда-либо вытягивали?

Надеемся на эту помощь

set a=%username%
echo %a%    
set a="hello"
echo %a%
42
задан 3 revs, 2 users 100% 18 August 2009 в 15:42
поделиться

13 ответов

Трассировщик лучей LINQ , конечно, превышает мой список =)

, я не совсем уверен, квалифицирует ли как изящный, но это - несомненно самое прохладное linq-выражение, которое я когда-либо видел!

, О, и только быть чрезвычайно ясным; я сделал не запись это (, Luke Hoban сделал)

27
ответ дан Markus Olsson 26 November 2019 в 23:36
поделиться

Работа с атрибутами:

private void WriteMemberDescriptions(Type type)
{
    var descriptions =
        from member in type.GetMembers()
        let attributes = member.GetAttributes<DescriptionAttribute>(true)
        let attribute = attributes.FirstOrDefault()
        where attribute != null
        select new
        {
            Member = member.Name,
            Text = attribute.Description
        };

        foreach(var description in descriptions)
        {
            Console.WriteLine("{0}: {1}", description.Member, description.Text);
        }
}

GetAttributes дополнительный метод:

public static class AttributeSelection
{
    public static IEnumerable<T> GetAttributes<T>(this ICustomAttributeProvider provider, bool inherit) where T : Attribute
    {
        if(provider == null)
        {
            throw new ArgumentNullException("provider");
        }

        return provider.GetCustomAttributes(typeof(T), inherit).Cast<T>();
    }
}

AttributeSelection производственный код и также определяет GetAttribute и HasAttribute. Я принял решение использовать let и where пункты в этом примере.

0
ответ дан Bryan Watts 26 November 2019 в 23:36
поделиться

Я думаю, что LINQ является существенным изменением к.NET, и это - очень мощный инструмент.

я использую LINQ для XML в производстве, чтобы проанализировать и отфильтровать записи от XML-файла 6 МБ (с 20 + уровни узла) в набор данных в двух строках кода.

Перед LINQ это проводило бы сотни строк кода и дни для отладки.

Это - то, что я называю изящными!

1
ответ дан ThatBloke 26 November 2019 в 23:36
поделиться

Я пытался придумать прохладный способ создать управление навигацией для веб-сайта, который я создавал. Я хотел использовать регулярный HTML, незаказанный элементы списка (использующий стандарт CSS, "Рыбы Сосунка" смотрят ) с эффектом наведения мыши главной навигации, который показывает выпадающие объекты. У меня был sql зависимый, кэшируемый DataSet с двумя таблицами (NavigationTopLevels & NavigationBottomLevels). Тогда все, к чему я имел, было, создают два объекта класса (TopNav & SubNav) с несколькими необходимыми свойствами (класс TopNav должен был иметь универсальный список bottomnav объектов-> List< SubNav> SubItems).


var TopNavs = from n in ds.NavigationTopLevels select new TopNav { NavigateUrl = String.Format("{0}/{1}", tmpURL, n.id), Text = n.Text, id = n.id, SubItems = new List<SubNav>( from si in ds.NavigationBottomLevels where si.parentID == n.id select new SubNav { id = si.id, level = si.NavLevel, NavigateUrl = String.Format("{0}/{1}/{2}", tmpURL, n.id, si.id), parentID = si.parentID, Text = si.Text } ) }; List<TopNav> TopNavigation = TopNavs.ToList();

Это не могло бы быть "самым прохладным", но для большого количества людей, которые хотят иметь динамическую навигацию, ее конфета для не запутывания вокруг в обычной логике цикличного выполнения, которая идет с этим. LINQ, если что-либо средство экономии времени в этом случае.

1
ответ дан Ian Patrick Hughes 26 November 2019 в 23:36
поделиться

На самом деле я довольно горжусь этим для генерации Excel docments: http://www.aaron-powell.com/linq-to-xml-to-excel

3
ответ дан Aaron Powell 26 November 2019 в 23:36
поделиться

Я сделал один (немного сумасшедший, но интересный) подобная вещь просто недавно:

2
ответ дан Tomas Petricek 26 November 2019 в 23:36
поделиться

Прогресс, Сообщая для длительных запросов LINQ. В сообщении в блоге можно найти дополнительный метод WithProgressReporting (), который позволяет Вам обнаружить и сообщить о прогрессе запроса linq, как это выполняется.

11
ответ дан Samuel Jack 26 November 2019 в 23:36
поделиться

Некоторый основной functionals:

public static class Functionals
{
    // One-argument Y-Combinator.
    public static Func<T, TResult> Y<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> F)
    {
        return t => F(Y(F))(t);
    }

    // Two-argument Y-Combinator.
    public static Func<T1, T2, TResult> Y<T1, T2, TResult>(Func<Func<T1, T2, TResult>, Func<T1, T2, TResult>> F)
    {
        return (t1, t2) => F(Y(F))(t1, t2);
    }

    // Three-arugument Y-Combinator.
    public static Func<T1, T2, T3, TResult> Y<T1, T2, T3, TResult>(Func<Func<T1, T2, T3, TResult>, Func<T1, T2, T3, TResult>> F)
    {
        return (t1, t2, t3) => F(Y(F))(t1, t2, t3);
    }

    // Four-arugument Y-Combinator.
    public static Func<T1, T2, T3, T4, TResult> Y<T1, T2, T3, T4, TResult>(Func<Func<T1, T2, T3, T4, TResult>, Func<T1, T2, T3, T4, TResult>> F)
    {
        return (t1, t2, t3, t4) => F(Y(F))(t1, t2, t3, t4);
    }

    // Curry first argument
    public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(Func<T1, T2, TResult> F)
    {
        return t1 => t2 => F(t1, t2);
    }

    // Curry second argument.
    public static Func<T2, Func<T1, TResult>> Curry2nd<T1, T2, TResult>(Func<T1, T2, TResult> F)
    {
        return t2 => t1 => F(t1, t2);
    }

    // Uncurry first argument.
    public static Func<T1, T2, TResult> Uncurry<T1, T2, TResult>(Func<T1, Func<T2, TResult>> F)
    {
        return (t1, t2) => F(t1)(t2);
    }

    // Uncurry second argument.
    public static Func<T1, T2, TResult> Uncurry2nd<T1, T2, TResult>(Func<T2, Func<T1, TResult>> F)
    {
        return (t1, t2) => F(t2)(t1);
    }
}

не делают много хорошего, если Вы не знаете, как использовать их. Чтобы знать, что, необходимо знать то, для чего они:

19
ответ дан Community 26 November 2019 в 23:36
поделиться

Не мой дизайн, но я использовал его несколько раз, введенный оператор переключения: http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx

Сохраненный меня так многие, если... еще, если... еще, если... еще, ЕСЛИ! операторы

3
ответ дан Aaron Powell 26 November 2019 в 23:36
поделиться

Для меня двойственность между делегатами ( Func , Action ) и выражениями ( Expression < Func > Expression > ) - это то, что дает начало наиболее умному использованию лямбда-выражений.

Например:

public static class PropertyChangedExtensions
{
    public static void Raise(this PropertyChangedEventHandler handler, Expression<Func<object>> propertyExpression)
    {
        if (handler != null)
        {
            // Retrieve lambda body
            var body = propertyExpression.Body as MemberExpression;
            if (body == null)
                throw new ArgumentException("'propertyExpression' should be a member expression");

            // Extract the right part (after "=>")
            var vmExpression = body.Expression as ConstantExpression;
            if (vmExpression == null)
                throw new ArgumentException("'propertyExpression' body should be a constant expression");

            // Create a reference to the calling object to pass it as the sender
            LambdaExpression vmlambda = Expression.Lambda(vmExpression);
            Delegate vmFunc = vmlambda.Compile();
            object vm = vmFunc.DynamicInvoke();

            // Extract the name of the property to raise a change on
            string propertyName = body.Member.Name;
            var e = new PropertyChangedEventArgs(propertyName);
            handler(vm, e);
        }
    }
}

Тогда вы можете «безопасно» реализовать INotifyPropertyChanged , позвонив по номеру

if (PropertyChanged != null)
    PropertyChanged.Raise( () => MyProperty );

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

4
ответ дан 26 November 2019 в 23:36
поделиться

Самая впечатляющая реализация Linq, с которой я когда-либо сталкивался, - это инфраструктура Brahma.

Ее можно использовать для выгрузки параллельных вычислений на графический процессор с помощью Linq to GPU. Вы пишете «запрос» в linq, а затем Брахма переводит его в HLSL (язык шейдеров высокого уровня), чтобы DirectX мог обработать его на графическом процессоре.

Этот сайт позволит мне вставить только одну ссылку, поэтому попробуйте эту веб-трансляцию с dotnetrocks:

http://www.dotnetrocks.com/default.aspx?showNum=466

Если вы хотите использовать Google для проекта Brahma Project, вы получите нужные страницы.

Чрезвычайно классный материал.

GJ

17
ответ дан 26 November 2019 в 23:36
поделиться

Возможно, не самый крутой, но в последнее время я использую их в любое время, когда у меня есть блок кода, который снова и снова проходит C+Pd только для того, чтобы изменить несколько строк. Например, выполнение простых SQL-команд для получения данных можно сделать так:

SqlDevice device = GetDevice();

return device.GetMultiple<Post>(
    "GetPosts",
    (s) => {
        s.Parameters.AddWithValue("@CreatedOn", DateTime.Today);

        return true;
    },
    (r, p) => {
        p.Title = r.Get<string>("Title");

        // Fill out post object

        return true;
    }
);

Что может вернуть список сообщений, которые были созданы сегодня. Таким образом, мне не придется копировать и вставлять блок try-catch-finally пятнадцать миллионов раз для каждой команды, объекта и так далее.

1
ответ дан 26 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: