2011-09-21 30 views
13

İşlevde bir iade türü olarak anonim bir yazı tipini kullanabilir ve sonra da bu yeni bir dizi/koleksiyona ek bir alan eklerken bir döndürülen değeri bir diziye veya bir dizi koleksiyonuna sığdırıyor mu? ... benim pseudocode mazurDönüş Anonim İşlevden dön

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

olası yinelenen [C# Anonim Tipi Nesneleri erişme] (http://stackoverflow.com/questions/713521/accessing-c-sharp -anonymous-type-objects) – nawfal

+0

olası imi [Return anonymous type?] (http://stackoverflow.com/questions/534690/return-anonymous-type) –

cevap

11

Bu bir very popular question. Genel olarak, güçlü yazım gereksinimi nedeniyle anonim bir tür döndüremezsiniz. Ancak birkaç geçici çözüm var.

  1. Dönüş değerini göstermek için basit bir tür oluşturun. (Bkz. here ve here). generating from usage ile basitleştirin.
  2. Döküm için örnek bir örnek kullanarak cast to the anonymous type için bir yardımcı yöntem oluşturun.
+1

Lütfen her zaman harici bağlantılardan küçük bir pasaj alıntı. Bu durumda, birincisi kırılmış, cevabınız oldukça işe yaramıyor. – Teejay

+0

"kullanımdan üretiliyor" bağlantısı bozuldu – dlchambers

+0

@dlchambers: Teşekkürler. Geri dönüş makinesinden bir arşiv kullanmak için bağlantıyı değiştirdim. – mellamokb

12

Hayır olamaz dönüş yönteminden isimsiz türü. Daha fazla bilgi için this MSDN dokümanı okuyun. anonymous türü yerine class veya struct kullanın.

Sen blog yazısı okumalısınız - Horrible grotty hack: returning an anonymous type instance

o zaman List<dynamic> dönmek ancak anonim nesnenin özelliklerini erişmek için dikkatli olun çerçeve 4.0 kullanıyorsanız.

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

Hayır, doğrudan anonim bir tür döndüremezsiniz, ancak bir impromptu interface kullanarak iade edebilirsiniz. Böyle bir şey:

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

Sevimli, ancak bu tür betonu yapmaktan daha kolay bir şey olmadığından emin değilim ... (IDE'lerde takımlar yardımcı olabilir) –

1

Kullanım object değil var. Anonim türün kapsamı dışındaki özelliklere erişmek için yansıma kullanmanız gerekir.

yani

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

Bu daha sonra 'dinamik' (C# 4) ile erişilebilir ... tüm pratik tip güvenliği kaybeder. –

2

Sadece kullanmak ve ArrayList

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

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