Подтвердить что ты не робот

Я что-то пропустил в LINQ?

Кажется, у меня что-то отсутствует в LINQ. Для меня это похоже на то, что я беру некоторые элементы SQL, которые мне нравятся меньше всего, и перемещая их на язык С# и используя их для других вещей.

Я имею в виду, что я мог видеть преимущества использования SQL-подобных утверждений на вещах, отличных от баз данных. Но если бы я хотел написать SQL, ну почему бы не просто написать SQL и не использовать С#? Что мне здесь не хватает?

4b9b3361

Ответ 1

LINQ не относится к SQL. LINQ - это применение парадигм функционального программирования для объектов.

LINQ to SQL - это ORM, построенный на основе основы LINQ, но LINQ намного больше. Я не использую LINQ to SQL, но я все время использую LINQ.

Возьмем задачу найти пересечение двух списков:

Перед LINQ эти задачи требуют записи вложенного foreach, который выполняет итерацию небольшого списка один раз для каждого элемента в большом списке O (N * M) и занимает около 10 строк кода.

foreach (int number in list1)
{
    foreach (int number2 in list2)
    {
        if (number2 == number)
        {
            returnList.add(number2);
        }
    }
}

Используя LINQ, он делает то же самое в одной строке кода:

var results = list1.Intersect(list2);

Вы заметите, что это не похоже на LINQ, но это так. Вам не нужно использовать синтаксис выражения, если вы этого не хотите.

Ответ 2

До:

// Init Movie
m_ImageArray = new Image[K_NB_IMAGE];

Stream l_ImageStream = null;
Bitmap l_Bitmap = null;

// get a reference to the current assembly
Assembly l_Assembly = Assembly.GetExecutingAssembly();

// get a list of resource names from the manifest
string[] l_ResourceName = l_Assembly.GetManifestResourceNames();

foreach (string l_Str in l_ResourceName)
{
    if (l_Str.EndsWith(".png"))
    {
        // attach to stream to the resource in the manifest
        l_ImageStream = l_Assembly.GetManifestResourceStream(l_Str);
        if (!(null == l_ImageStream))
        {
            // create a new bitmap from this stream and 
            // add it to the arraylist
            l_Bitmap = Bitmap.FromStream(l_ImageStream) as Bitmap;
            if (!(null == l_Bitmap))
            {
                int l_Index = Convert.ToInt32(l_Str.Substring(l_Str.Length - 6, 2));
                l_Index -= 1;
                if (l_Index < 0) l_Index = 0;
                if (l_Index > K_NB_IMAGE) l_Index = K_NB_IMAGE;
                m_ImageArray[l_Index] = l_Bitmap;
            }
            l_Bitmap = null;
            l_ImageStream.Close();
            l_ImageStream = null;
        } // if
    } // if
} // foreach

После:

Assembly l_Assembly = Assembly.GetExecutingAssembly();

//Linq is the tops
m_ImageList = l_Assembly.GetManifestResourceNames()
    .Where(a => a.EndsWith(".png"))
    .OrderBy(b => b)
    .Select(c => l_Assembly.GetManifestResourceStream(c))
    .Where(d => d != null)  //ImageStream not null
    .Select(e => Bitmap.FromStream(e))
    .Where(f => f != null)  //Bitmap not null
    .ToList();

Или, альтернативно (синтаксис запроса):

Assembly l_Assembly = Assembly.GetExecutingAssembly();

//Linq is the tops
m_ImageList = (
    from resource in l_Assembly.GetManifestResourceNames()
    where resource.EndsWith(".png")
    orderby resource
    let imageStream = l_Assembly.GetManifestResourceStream(resource)
    where imageStream != null
    let bitmap = Bitmap.FromStream(imageStream)
    where bitmap != null)
    .ToList();

Ответ 3

Итак, действительно, действительно большое дело о LINQ не имеет ничего общего с Linq to SQL. Это о улучшениях, которые он привнес в язык С#.

Ответ 4

LINQ - это не просто система ORM, как отметил Джонатан, она привносит в С# множество функциональных элементов программирования. И он позволяет вам делать много "баз данных-y" в обычном С# -коде. Трудно объяснить, насколько невероятно мощным может быть. Подумайте о том, насколько значительная часть хорошо структурированных структур данных (таких как список, стек, словарь/хэш и т.д.), Включенных в общие рамки, улучшила состояние развития на современных языках. Именно потому, что использование этих структур данных очень распространено, и снижение интеллектуальных накладных расходов при их использовании является огромной выгодой. LINQ не делает ничего, что вы не можете сделать самостоятельно, но он делает много операций намного более простым и намного проще.

Рассмотрим пример выполнения удаления дубликатов из неупорядоченного списка. На языке более низкого уровня, таком как C или С++, вам, вероятно, придется сортировать список и поддерживать два индекса в списке при удалении обмана. На языке с хэшами (Java, С#, Javascript, Perl и т.д.) Вы можете создать хэш, где ключи являются уникальными значениями, а затем извлечь ключи в новый список. С LINQ вы можете просто сделать это:

int[] data = { 0, 1, 3, 3, 7, 8, 0, 9, 2, 1 };

var uniqueData = data.GroupBy(i => i).Select(g => g.Key);

Ответ 5

Поскольку linq действительно является монадами в sql-одежде, я использую его в проекте для создания асинхронных веб-запросов с продолжением монады, и это доказывает, что он работает очень хорошо!

Ознакомьтесь с этими статьями: http://www.aboutcode.net/2008/01/14/Async+WebRequest+Using+LINQ+Syntax.aspx http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

Из первой статьи:

    var requests = new[] 
    {
        WebRequest.Create("http://www.google.com/"),
        WebRequest.Create("http://www.yahoo.com/"),
        WebRequest.Create("http://channel9.msdn.com/")
    };

    var pages = from request in requests
                select
                    from response in request.GetResponseAsync()
                    let stream = response.GetResponseStream()
                    from html in stream.ReadToEndAsync()
                    select new { html, response };

    foreach (var page in pages)
    {
        page(d =>
        {
            Console.WriteLine(d.response.ResponseUri.ToString());
            Console.WriteLine(d.html.Substring(0, 40));
            Console.WriteLine();
        });
    }

Ответ 6

Дело в том, что LINQ интегрирует ваши запросы на ваш основной язык программирования, позволяя вашей среде IDE предоставить вам некоторые возможности (например, Intellisense и поддержку отладки), которые у вас в противном случае не были бы, и разрешить компилятору печатать на машинах, проверьте свой код SQL (что невозможно с обычным строковым запросом).