2017-02-08 2 views
3

У меня есть класс с большим количеством свойств, который мне нужно группировать почти по всем столбцам.Группа Linq, за исключением столбца

class Sample { 
    public string S1 { get; set; } 
    public string S2 { get; set; } 
    public string S3 { get; set; } 
    public string S4 { get; set; } 
    // ... all the way to this: 
    public string S99 { get; set; } 

    public decimal? N1 { get; set; } 
    public decimal? N2 { get; set; } 
    public decimal? N3 { get; set; } 
    public decimal? N4 { get; set; } 
    // ... all the way to this: 
    public decimal? N99 { get; set; } 
} 

Время от времени мне нужно группировать по всем столбцам, за исключением одного или двух десятичных столбцов и вернуть некоторый результат, основанный на этом (а именно объект со всеми полями, но с какой-то десятичное значение в виде суммы или макс) ,

Есть ли какой-либо метод расширения, который позволил бы мне сделать что-то вроде этого:

sampleCollection.GroupByExcept(x => x.N2, x => x.N5).Select(....); 

вместо указания всех столбцов в объекте?

ответ

0

Заимствования из этого ответа here:

Создать класс EqualityComparer

public class EqualityComparer<T> : IEqualityComparer<T> 
{ 
    public bool Equals(T x, T y) 
    { 
     IDictionary<string, object> xP = x as IDictionary<string, object>; 
     IDictionary<string, object> yP = y as IDictionary<string, object>; 

     if (xP.Count != yP.Count) 
      return false; 
     if (xP.Keys.Except(yP.Keys).Any()) 
      return false; 
     if (yP.Keys.Except(xP.Keys).Any()) 
      return false; 
     foreach (var pair in xP) 
      if (pair.Value.Equals(yP[pair.Key])==false) 
       return false; 
     return true; 

    } 

    public int GetHashCode(T obj) 
    { 
     return obj.ToString().GetHashCode(); 
    } 
} 

Затем создайте свой GroupContent метод:

private void GroupContent<T>(List<T> dataList, string[] columns, string[] columnsToExclude) 
    { 
string[] columnsToGroup = columns.Except(columnsToExclude).ToArray(); 
     EqualityComparer<IDictionary<string, object>> equalityComparer = new EqualityComparer<IDictionary<string, object>>(); 
     var groupedList = dataList.GroupBy(x => 
     { 
      var groupByColumns = new System.Dynamic.ExpandoObject(); 
      ((IDictionary<string, object>)groupByColumns).Clear(); 
      foreach (string column in columnsToGroup) 
       ((IDictionary<string, object>)groupByColumns).Add(column, GetPropertyValue(x, column)); 
      return groupByColumns; 
     }, equalityComparer); 


     foreach (var item in groupedList) 
     { 
      Console.WriteLine("Group : " + string.Join(",", item.Key)); 
      foreach (object obj in item) 
       Console.WriteLine("Item : " + obj); 
      Console.WriteLine(); 
     } 

    } 

    private static object GetPropertyValue(object obj, string propertyName) 
    { 
     return obj.GetType().GetProperty(propertyName).GetValue(obj, null); 
    } 
Смежные вопросы