2

私は次のリクエストを行っています。想定どおりに機能し、正しく構造化されたデータを返します。(共通フィールドに対応する「head」を持つ要素を作成し、そのフィールドに同じ値のすべての要素を「tail」の配列として配置します。)

var result
  = from A in As
    group A by A.F into B
    select new 
    {
      F1 = B.Key,
      F2 = from A in As
           where A.F == B.Key
           select A
    };

ここで、その型を明示的に宣言したいと思います。型に関する私の仮定が正しいことをデバッガーでチェックしましたが、それを宣言しようとすると、変換エラーが発生します。

  1. なんで?
  2. タイプを明示的に宣言するにはどうすればよいですか?

私は宣言のさまざまな変形を試しましが、失敗しました。

IEnumerable<Tuple<String, IEnumerable<MyType>>> result 
  = from ...
    } as Tuple<String, MyType>;

私はそれが実行可能であることを知っていますが、それを正しくするための経験が不足しています。次のように動作することに気づきました。ただし、 Objectを実際の変数型と交換して、さらに一歩進める方法がわかりません。

IEnumerable<Object> result 
  = from ...
    } as Object;
4

5 に答える 5

0

Tuple<String, IEnumerable<MyType>> <=> Tuple<String, MyType>最初はこれですが、ここでは問題ありません。匿名型を にキャストすることはできませんTuple。タイプを明示的に定義してから使用する必要があります。

public class YourClass
{
    public string F1 {get; set;}
    public IEnumerable<MyType> F2 {get; set;}
} 

IEnumerable<YourClass> result
  = from A in As
    group A by A.F into B
    select new YourClass
    {
      F1 = B.Key,
      F2 = from A in As
           where A.F == B.Key
           select A
    };
于 2013-01-16T13:02:58.320 に答える
0

select new {... } を使用して匿名型を作成しているため、var を使用する必要があります。型を明示的に表現する方法はありません。

于 2013-01-16T13:03:07.820 に答える
0

オブジェクトの "内部" が同じであることはわかっていますが、C# は静的に型付けされ、メンバーではなくメタデータ (名前、名前空間など) に基づいて型を解決します。ではなく匿名型を選択するTupleため、型リゾルバーはそれが として使用されることに「同意」できませんTuple

Visual Studio でキーワードにカーソルを合わせるとvar、それがどのような型であるかがわかります ( dynamic. ただし、匿名型を使用しているため、型を明示的に記述することはできません。C# ソース コードには名前がありません。

あなたができることは、他の場所でタイプを定義することです

internal class MyObj
{
    public MyObj(string head, IEnumerable<Foo> tail)
    {
        Head = head;
        Tail = tail;
    }

    public string Head { get; set; }
    public IEnumerable<Foo> Tail { get; set; }
}

次に、クエリで使用します。

IEnumerable<MyObj> result
  = from A in As
    group A by A.F into B
    select new MyObj(
        B.Key,
        from A in As
        where A.F == B.Key
        select A);

または、ジョンがここでTuple提案したように a を使用します。

于 2013-01-16T13:07:02.697 に答える
0

と言って、型を明示的に宣言することはできません

select new {
   Member = Value
}

匿名型を使用しています-そのような型には言葉では言い表せない名前があるため、これは使用する必要がある場合の1つですvar.

于 2013-01-16T13:04:11.307 に答える
0

select生成される列挙可能なシーケンスの型は、句の後の式の型によって決まります。

select Tuple.Create(
    B.Key,
    (from A in As where A.F == B.Key select A).ToList()
)
于 2013-01-16T12:58:58.983 に答える