2009-11-18 4 views
7

को पिवोट कैसे करें I वस्तुओं के संग्रह को "पिवट" या "घुमाने" की आवश्यकता है।आईव्यूमेरेबल <T>

/// <summary>Converts an IEnumerable into a pivoted DataTable object.</summary> 
/// <param name="collection">The IEnumerable object to pivot and convert.</param> 
/// <param name="headingMember">The name of a public field or property member of type T to be used as column name's in the pivoted DataTable object.</param> 
/// <param name="membersHeading">The name of the column that lists the public fields and properties of type T.</param>   
static DataTable Pivot<T>(this IEnumerable<T> collection, string headingMember, string membersHeading) 
{ 
    // get object information 
    var type = typeof(T); 
    var members = new List<MemberInfo>(); 
    members.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.Instance)); 
    members.AddRange(type.GetFields(BindingFlags.Public | BindingFlags.Instance)); 

    // create dataTable and establish schema 
    var dt = new DataTable(); 
    dt.Columns.Add(membersHeading); 
    foreach (var item in collection) 
    { 
     var member = members.Single(x => x.Name == headingMember); 
     if (member is FieldInfo)       
     { 
      FieldInfo fieldInfo = (FieldInfo)member; 
      dt.Columns.Add(fieldInfo.GetValue(item).ToString(), fieldInfo.FieldType); 
     } 

     if (member is PropertyInfo) 
     { 
      PropertyInfo propInfo = (PropertyInfo)member; 
      dt.Columns.Add(propInfo.GetValue(item, null).ToString(), propInfo.PropertyType); 
     } 
    } 

    // add rows to table 
    foreach (MemberInfo member in members.Where(x => x.Name != headingMember)) 
    { 
     var row = dt.NewRow(); 
     row[0] = member.Name; 
     int i = 1; 

     foreach (var item in collection) 
     { 
      if (member is FieldInfo) 
       row[i++] = ((FieldInfo)member).GetValue(item); 

      if (member is PropertyInfo) 
       row[i++] = ((PropertyInfo)member).GetValue(item, null); 
     } 

     dt.Rows.Add(row); 
    } 

    return dt; 
} 

वहाँ क्या यह करने के लिए एक बेहतर तरीका हो सकता है है:

var people = new List<Person>(new[] { 
       new Person{ Name="Ronnie",Age=25, HairColor="Brown",EyeColor="Blue"}, 
       new Person{ Name="Tina",Age=25, HairColor="Brown",EyeColor="Green"}, 
       new Person{ Name="Lukus",Age=4, HairColor="Blonde",EyeColor="Blue"}  
      }); 

DataTable rotatedData = people.Pivot("Name", "Property");     

/* Results In: 
* ___________________________________________ 
* Property | Ronnie | Tina | Lukus 
* ___________________________________________ 
* Age  | 25  | 25  | 4 
* HairColor | Brown | Brown | Blonde 
* EyeColor | Blue | Green | Blue 
* ____________________________________________ 
*/ 

यहाँ कोड है कि मैं यह पूरा लिखा है: उदाहरण के मैं क्या करने की जरूरत स्पष्ट होगा ?

+0

यह बहुत सारे प्रश्नों का डुप्लिकेट है ("पिवट लिनक" के लिए खोजें)। – jason

+0

मैंने पूछा उससे पहले मैंने किया था। –

उत्तर

1

आप नाम पर समूह का उपयोग करके केवल एक आईनेमेरेबल को पिवोट कर सकते हैं। मान लेना अलग है। एक बार डेटा को पिट करने के बाद, आप Convert IEnumerable to DataTable कर सकते हैं।

+0

क्या आप एक कोड नमूना प्रदान कर सकते हैं? – Lucas

संबंधित मुद्दे