[C#] LINQについて何か不足していますか?


Answers

前:

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

私はLINQについて何か不足しているようです。 私にとっては、SQLの要素のうち、好きなものをC#言語に置き換えて、他のものに使用することができるようです。

つまり、データベース以外のものにSQLのようなステートメントを使うことの利点が分かりました。 しかし、もし私がSQLを書こうと思っていたら、SQLを書いてC#からそれを外さないのはなぜですか? 私はここで何が欠けていますか?




重要なことは、LINQが主なプログラミング言語にクエリを統合しているため、そうでない場合はIntellisenseやデバッグサポートなどの機能をIDEに提供し、コンパイラはSQLの型チェックを可能にしますコード(通常の文字列クエリでは不可能です)。




LINQは単なるORMシステムではありません.Jonathanは、C#に多くの機能プログラミング要素をもたらしていると指摘しています。 また、通常のC#コードで多くの "データベース-y"のことを行うことができます。 信じられないほど強力なことがどれくらいのものかを説明するのは難しいです。 一般的なフレームワークに含まれているソリッドでよく設計された汎用データ構造(リスト、スタック、辞書/ハッシュなど)が近代言語の開発状況をどれだけ改善したかを考慮します。 これらのデータ構造を使用することは非常に一般的であり、それらを使用することの知的オーバーヘッドを削減することが大きな利点です。 LINQは自分でできないものは何もしませんが、多くの操作がはるかに簡単で簡単です。

順序付けされていないリストから重複を削除する従来の例を考えてみましょう。 CやC ++のような低レベル言語では、おそらく、リストをソートして、二重引用符を削除するときに2つのインデックスをリストに保持する必要があります。 ハッシュ(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);