0

次のようなことを行うデータ行からいくつかのフィールドを選択したいと思います。

var result = datatable.AsEnumerable()
    .Select(x => new { x.Field<string>("Field1"), x.Field<string>("Field2")});

残念ながら、これは次のように機能していません。

匿名タイプのメンバー宣言子が無効です。匿名型のメンバーは、メンバーの割り当て、単純な名前、またはメンバーアクセスを使用して宣言する必要があります。

どうすれば私が望むことを達成できますか?

編集:それを達成するために(少なくとも)2つの方法があるようです:

  1. 名前'日:

    var result = datatable.AsEnumerable()。Select(x => new
    {{
        Field1 = x.Field( "Field1")、
        Field2 = x.Field( "Field2")
    });
  2. 新しいオブジェクトを作成します

クラスがあるとしましょう

class MyClass
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    public MyClass(string field1, string field2)
    {
        this.Field1 = field1;
        this.Field2 = field2;
    }
}

次のことができます。

var result = datatable.AsEnumerable()
    .Select(x => new MyClass(x.Field<string>("Field1"), x.Field<string>("Field2")));
4

3 に答える 3

2

プロパティに名前を付ける必要があります。

var result = datatable.AsEnumerable()
    .Select(x => new 
    { 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")
    });

そしてそれを使用します:

var field1 = result.First().Field1;

コンパイラは、のようなものから名前を推測する方法を知りませんx.Field<string>("Field1")。しかし、これはうまくいくでしょう:

int id = 1;
string name = "Myname";
var obj = new { id, name }; // Names are inferred from the variable name.

var result = obj.name; // This would work
于 2012-11-15T16:31:23.120 に答える
2

匿名タイプのメンバーにいくつかの名前を付ける必要があります。

var result = datatable.AsEnumerable()
    .Select(x => new { 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")});

あなたがそれについて考えるならば、名前が後でプロパティを参照することを非常に難しくすることはないでしょう、あなたは反射といくつかの推測作業を使わなければならないでしょう。いずれの場合も、バックグラウンドで匿名タイプを作成できるように、名前を定義する必要があります。


Tuple匿名タイプの代わりに返すことを好む場合は、

    var result = datatable.AsEnumerable()
    .Select(x => Tuple.Create( 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")));

Item1次に、とでItem2それぞれメンバーにアクセスできます。

ただし、このTupleクラスは.Net 4.0の新機能であり、質問には3.5のタグが付けられています。


あなたのコメントに応えて、あなたはいつでもあなた自身のタイプを宣言することができます

public class MyPair<TItem1, TItem2>
{
    public MyPair(TItem1 item1, TItem2 item2)
    {
        this.Item1 = item1;
        this.Item2 = item2;
    }

    public TItem1 Item1 { get; private set; }
    public TItem2 Item2 { get; private set; }
}

これは、明らかにこのように使用しますが、

var result = datatable.AsEnumerable()
    .Select(x => new MyPair( 
        Field1 = x.Field<string>("Field1"), 
        Field2 = x.Field<string>("Field2")));
于 2012-11-15T16:32:49.263 に答える
1

さて、エラーはそれをすべて言います、メンバーに名前を付けてください:

var result = datatable.AsEnumerable()
.Select(x => new { 
                    First = x.Field<string>("Field1"),
                    Second = x.Field<string>("Field2")
                 });
于 2012-11-15T16:31:50.700 に答える