문제

LINQ에 대해 뭔가 빠진 것 같습니다.나에게는 내가 가장 좋아하지 않는 SQL 요소 중 일부를 C# 언어로 옮겨서 다른 용도로 사용하는 것처럼 보입니다.

내 말은, 데이터베이스가 아닌 다른 것에 SQL과 유사한 문을 사용하면 이점이 있다는 것을 알 수 있다는 것입니다.하지만 SQL을 작성하고 싶다면 그냥 SQL을 작성하고 C#에서는 제외하면 어떨까요?내가 여기서 무엇을 놓치고 있는 걸까요?

도움이 되었습니까?

해결책

LINQ는 SQL에 관한 것이 아닙니다.LINQ는 객체에 함수형 프로그래밍 패러다임을 적용하는 것입니다.

LINQ to SQL은 LINQ 기반 위에 구축된 ORM이지만 LINQ는 그 이상입니다.저는 LINQ to SQL을 사용하지 않지만 항상 LINQ를 사용합니다.

두 목록의 교차점을 찾는 작업을 수행해 보세요.

LINQ 이전에는 이 작업을 수행하려면 큰 목록 O(N*M)의 모든 항목에 대해 작은 목록을 한 번씩 반복하고 약 10줄의 코드를 사용하는 중첩된 foreach를 작성해야 했습니다.

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

LINQ를 사용하면 한 줄의 코드로 동일한 작업을 수행합니다.

var results = list1.Intersect(list2);

LINQ처럼 보이지는 않지만 실제로는 그렇습니다.원하지 않는 경우 표현식 구문을 사용할 필요가 없습니다.

다른 팁

전에:

// 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();

따라서 LINQ의 정말 중요한 점은 Linq to SQL과는 아무런 관련이 없습니다.C# 언어 자체에 가져온 향상된 기능에 관한 것입니다.

LINQ는 단순한 ORM 시스템이 아닙니다. Jonathan이 지적했듯이 LINQ는 C#에 많은 기능적 프로그래밍 요소를 제공합니다.그리고 일반 C# 코드에서 많은 "데이터베이스 수준" 작업을 수행할 수 있습니다.그것이 얼마나 믿을 수 없을 정도로 강력할 수 있는지 설명하기는 어렵습니다.일반 프레임워크에 포함된 견고하고 잘 설계된 일반 데이터 구조(예: 목록, 스택, 사전/해시 등)가 현대 언어의 개발 상태를 얼마나 개선했는지 생각해 보세요.이러한 데이터 구조를 사용하는 것은 매우 일반적이고 이를 사용하는 데 따른 지적 오버헤드를 줄이는 것이 큰 이점이기 때문입니다.LINQ는 사용자가 스스로 할 수 없는 작업을 수행하지 않지만 많은 작업을 훨씬 더 간단하고 쉽게 만듭니다.

순서가 지정되지 않은 목록에서 중복 항목을 제거하는 전통적인 예를 생각해 보세요.C 또는 C++와 같은 하위 수준 언어에서는 목록을 정렬하고 중복 항목을 제거할 때 목록에 두 개의 색인을 유지해야 할 수 있습니다.해시가 있는 언어(Java, C#, 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);

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();
        });
    }

요점은 LINQ가 쿼리를 기본 프로그래밍 언어에 통합하여 IDE가 다른 경우에는 제공하지 못했던 일부 기능(예: Intellisense 및 디버그 지원)을 제공하고 컴파일러가 SQL 형식을 확인할 수 있도록 한다는 것입니다. 코드(일반 문자열 쿼리로는 불가능)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top