web-dev-qa-db-ja.com

関数から匿名型を返す

関数の戻り値の型として匿名型を使用し、その配列またはコレクションに値を返し、新しい配列/コレクションにフィールドを追加することはできますか?すみません、私の疑似コード...

private var GetRowGroups(string columnName)
{
var groupQuery = from table in _dataSetDataTable.AsEnumerable()
                             group table by new { column1 = table[columnName] }
                                 into groupedTable
                                 select new
                                 {
                                     groupName = groupedTable.Key.column1,
                                     rowSpan = groupedTable.Count()
                                 };
    return groupQuery;

}

private void CreateListofRowGroups()
{
    var RowGroupList = new List<????>();
    RowGroupList.Add(GetRowGroups("col1"));
    RowGroupList.Add(GetRowGroups("col2"));
    RowGroupList.Add(GetRowGroups("col3"));

}
23
Dkong

これは 非常に人気のある質問 です。一般に、強い型付けが必要なため、匿名型を返すことはできません。ただし、いくつかの回避策があります。

  1. 戻り値を表す単純型を作成します。 ( ここ および ここ を参照)。 使用法から生成 で簡単にします。
  2. キャスト用のサンプルインスタンスを使用して、 匿名型にキャスト するヘルパーメソッドを作成します。
17
mellamokb

メソッドから匿名型を返すことはできませんできません。詳細については this MSDNドキュメントを参照してください。 classタイプの代わりにstructまたはanonymousを使用します。

ブログの投稿を読む必要があります- 恐ろしい粗末なハック:匿名型インスタンスを返す

フレームワーク4.0を使用している場合、List<dynamic>を返すことができますが、匿名オブジェクトのプロパティにアクセスするように注意してください。

private List<dynamic> GetRowGroups(string columnName)
{
var groupQuery = from table in _dataSetDataTable.AsEnumerable()
                             group table by new { column1 = table[columnName] }
                                 into groupedTable
                                 select new
                                 {
                                     groupName = groupedTable.Key.column1,
                                     rowSpan = groupedTable.Count()
                                 };
    return groupQuery.ToList<dynamic>();
}
18
adatapost

いいえ、匿名型を直接返すことはできませんが、 impromptuインターフェース を使用して返すことができます。このようなもの:

public interface IMyInterface
{
    string GroupName { get;  }
    int RowSpan { get; }
}

private IEnumerable<IMyInterface> GetRowGroups()
{
    var list =
        from item in table
        select new
        {
            GroupName = groupedTable.Key.column1,
            RowSpan = groupedTable.Count()
        }
        .ActLike<IMyInterface>();

    return list;
}
4
Chris Fulstow

ArrayListを使用するだけ

    public static ArrayList GetMembersItems(string ProjectGuid)
    {
        ArrayList items = new ArrayList(); 

              items.AddRange(yourVariable 
                        .Where(p => p.yourproperty == something)
                        .ToList());
            return items;
    }
2
Alex Z

objectではなくvarを使用してください。ただし、匿名型のスコープ外のプロパティにアクセスするには、リフレクションを使用する必要があります。

つまり.

private object GetRowGroups(string columnName) 
...
var RowGroupList = new List<object>();
...
1
Plymouth223

C#7からタプルのリストを返すことができます:

private IEnumerable<(string, string)> GetRowGroups(string columnName)
{
    return from table in _dataSetDataTable.AsEnumerable()
           group table by new { column1 = table[columnName] }
           into groupedTable
           select (groupedTable.Key.column1, groupedTable.Count());
}

タプルのメンバーに名前を付けることもできます。

private IEnumerable<(string groupName, string rowSpan)> GetRowGroups(string columnName)
{
    return from table in _dataSetDataTable.AsEnumerable()
           group table by new { column1 = table[columnName] }
           into groupedTable
           select (groupedTable.Key.column1, groupedTable.Count());
}

ただし、必要な System.ValueTuple Nuget Package Managerから。

とにかく、特にパブリックAPIの一部である場合は、目的を明確に示す名前を付けることをお勧めします。これを述べた後、それらのプロパティを保持し、そのタイプのリストを返すクラスを作成することを検討する必要があります。

0
HimBromBeere