関数の戻り値の型として匿名型を使用し、その配列またはコレクションに値を返し、新しい配列/コレクションにフィールドを追加することはできますか?すみません、私の疑似コード...
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"));
}
これは 非常に人気のある質問 です。一般に、強い型付けが必要なため、匿名型を返すことはできません。ただし、いくつかの回避策があります。
メソッドから匿名型を返すことはできませんできません。詳細については 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>();
}
いいえ、匿名型を直接返すことはできませんが、 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;
}
ArrayListを使用するだけ
public static ArrayList GetMembersItems(string ProjectGuid)
{
ArrayList items = new ArrayList();
items.AddRange(yourVariable
.Where(p => p.yourproperty == something)
.ToList());
return items;
}
object
ではなくvar
を使用してください。ただし、匿名型のスコープ外のプロパティにアクセスするには、リフレクションを使用する必要があります。
つまり.
private object GetRowGroups(string columnName)
...
var RowGroupList = new List<object>();
...
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の一部である場合は、目的を明確に示す名前を付けることをお勧めします。これを述べた後、それらのプロパティを保持し、そのタイプのリストを返すクラスを作成することを検討する必要があります。