web-dev-qa-db-ja.com

.Select()のように、LINQの射影とは何ですか

私は通常、モバイルアプリの開発を行っていますが、常に.Selectがあるとは限りません。しかし、これが少し使われているのを見たことがありますが、それが何をするのか、それが何をするのかは本当にわかりません。それはのようなものです

    from a in list select a // a.Property // new Thing { a.Property}

.Select()を使用するコードを見たとき、それが何をしているかに少し混乱していたので、私は尋ねています。

12
Michael DiLeo

.Select()は、コード内のLINQ、selectのメソッド構文からのものですfrom a in list select aはクエリ構文用です。どちらも同じで、クエリ構文はメソッド構文にコンパイルされます。

次のように表示されます。 LINQ(C#)のクエリ構文とメソッド構文

投影:

プロジェクション操作-MSDN

投影とは、オブジェクトを新しいフォームに変換する操作のことで、多くの場合、後で使用されるプロパティのみで構成されます。プロジェクションを使用することで、各オブジェクトから構築される新しいタイプを構築できます。プロパティを投影して、そのプロパティに対して数学関数を実行できます。元のオブジェクトを変更せずに投影することもできます。

次も表示される場合があります: LINQ Projection

クエリの結果を変換するプロセスは、プロジェクションと呼ばれます。フィルタを適用した後、クエリの結果を予測して、返されるコレクションのタイプを変更できます。

MSDNの例

List<string> words = new List<string>() { "an", "Apple", "a", "day" };
var query = from Word in words
            select Word.Substring(0, 1);

上記の例では、各文字列インスタンスの最初の文字のみが選択/投影されます。

コレクションからいくつかのフィールドを選択して、 匿名型 または既存のクラスのインスタンスを作成することもできます。このプロセスはプロジェクションと呼ばれます。

from a in list select new { ID = a.Id}

上記のコードフィールドでは、Idは他のフィールドを無視して匿名型に投影されます。リストに次のように定義されたタイプMyClassのオブジェクトがあるとします。

class MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
}

これで、IdNameを次のような匿名型に投影できます。

クエリ構文:

var result = from a in list
             select new
                 {
                     ID = a.Id,
                     Name = a.Name,
                 };

メソッド構文

var result = list.Select(r => new { ID = r.Id, Name = r.Name });

結果を新しいクラスに投影することもできます。次のようなクラスがあるとします。

    class TemporaryHolderClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

次に、次のことができます。

クエリ構文:

 var result = from a in list
             select new TemporaryHolderClass
                 {
                     Id = a.Id,
                     Name = a.Name,
                 };

メソッド構文:

var result = list.Select(r => new TemporaryHolderClass  
                            { 
                                Id = r.Id, 
                                Name = r.Name 
                            });

LINQ toSQLまたはEntityFramework用に生成/作成されたクラスに投影しようとしていない場合は、同じクラスに投影することもできます。

31
Habib

私の要約は、結果(または結果のサブセット)を取得し、ローカルコンテキストで使用するためにすばやく再構築できるようにすることです。

Select句はクエリの結果を生成し、返される各要素の「形状」またはタイプを指定します。たとえば、結果が完全なCustomerオブジェクトで構成されるか、1つのメンバーのみで構成されるか、メンバーのサブセットで構成されるか、計算または新しいオブジェクトの作成に基づいてまったく異なる結果タイプで構成されるかを指定できます。

ソース: http://msdn.Microsoft.com/en-us/library/bb397927.aspx

これには多くの可能な使用法がありますが、1つは、文字列であるプロパティ(たとえば、Name)を含み、次のエントリのみで列挙を返すことができる複雑なオブジェクトを取得することです。 Name。逆のこともできると思います。たとえば、そのプロパティを使用して、1つまたは複数のプロパティを渡しているときに新しいタイプのオブジェクトを作成/返します。

1
Frank V

それは「マッピング」を意味します。シーケンスの各要素を変換されたシーケンスにマップします。画像を見る前は、その意味がわからなかった。

みことばの意味はどこから来たのですか?

簡単に言えば、数学! https://mathworld.wolfram.com/Projection.html

enter image description here

0
snr