using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; namespace APT.Infrastructure.Core { /// /// Linq 拓展方法类 /// public static class LinqExtensions { public static void ForEach(this IEnumerable source, Action action) { Contract.Requires(action != null); foreach (var element in source) action(element); } public class DGroupBy : IGrouping { private List _innerlist = new List(); private object[] _key; public DGroupBy(object[] key) { _key = key; } public object[] Key { get { return _key; } } public void Add(T value) { _innerlist.Add(value); } public IEnumerator GetEnumerator() { return this._innerlist.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this._innerlist.GetEnumerator(); } } public static IEnumerable> DynamicGroupBy(this IEnumerable data, string[] keys) { List> list = new List>(); foreach (var item in data.Select(x => new { k = keys.Select(y => x.GetType().GetProperty(y).GetValue(x, null)).ToArray(), v = x })) { DGroupBy existing = list.SingleOrDefault(x => x.Key.Zip(item.k, (a, b) => a.Equals(b)).All(y => y)); if (existing == null) { existing = new DGroupBy(item.k); list.Add(existing); } existing.Add(item.v); } return list; } } }