2011-09-21 5 views
13

함수에서 익명 형식을 반환 형식으로 사용하고 그 반환 값을 배열이나 컬렉션에 넣을 수 있습니까? 또한 새 배열/컬렉션에 추가 필드를 추가 할 수 있습니까? ... 내 의사 변명함수에서 익명 형식을 반환하십시오.

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")); 

} 
+0

의 중복 가능성 [C# 익명 형식의 개체에 액세스] (http://stackoverflow.com/questions/713521/accessing-c-sharp -anonymous-type-objects) – nawfal

+0

가능한 [Return anonymous type?] (http://stackoverflow.com/questions/534690/return-anonymous-type) –

답변

11

이것은 very popular question입니다. 일반적으로 강력한 입력 요구 사항으로 인해 익명 유형을 반환 할 수 없습니다. 그러나 몇 가지 해결 방법이 있습니다.

  1. 반환 값을 나타내는 간단한 형식을 만듭니다. (herehere 참조). generating from usage으로 간단하게 작성하십시오.
  2. 캐스팅 할 샘플 인스턴스를 사용하여 도우미 메서드를 cast to the anonymous type으로 만듭니다.
+1

외부 링크에서 항상 작은 발췌문을 인용하십시오. 이 경우, 첫 번째 것이 깨져서 당신의 대답은 전혀 쓸모가 없습니다. – Teejay

+0

"사용에서 생성 중"링크가 깨졌습니다. – dlchambers

+0

@dlchambers : Thanks. 나는 길 찾기 기계에서 아카이브를 사용하도록 링크를 변경했습니다. – mellamokb

12

아니오 수 없습니다 반환 방법에서 익명의 유형입니다.하지 자세한 내용은 this MSDN doc을 참조하십시오. anonymous 유형 대신 class 또는 struct을 사용하십시오.

당신은 블로그 게시물을 읽어야합니다 - Horrible grotty hack: returning an anonymous type instance

당신이 다음 List<dynamic>를 반환하지만 익명 객체의 속성에 액세스 할 수 조심해야 할 프레임 워크 4.0을 사용하는 경우.

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>(); 
} 
4

아니요. 익명 형식을 직접 반환 할 수는 없지만 impromptu interface을 사용하여 반환 할 수는 있습니다. 이런 식으로 뭔가 :

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; 
} 
+1

귀엽다. 그러나 이것은 단지 타입을 콘크리트로 만드는 것보다 쉽지 않다. (IDE의 도구가 도움이된다.) –

1

사용 object하지 var. 하지만 익명 형식의 범위를 벗어나는 속성에 액세스하려면 리플렉션을 사용해야합니다.

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

이것은 나중에'dynamic' (C# 4)를 통해 접근 할 수있다. 그것은 모든 실용적인 유형 안전을 잃는다. –

2

그냥 사용하고 ArrayList를

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

       items.AddRange(yourVariable 
         .Where(p => p.yourproperty == something) 
         .ToList()); 
      return items; 
    } 
관련 문제