DOTNETBOY

C#之动态GroupBy参数

static class LinqExt
{
public class DGroupBy<T> : IGrouping<object[], T>
{
private List<T> _innerlist = new List<T>();
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<T> GetEnumerator()
{
return this._innerlist.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this._innerlist.GetEnumerator();
}
}

public static IEnumerable<IGrouping<object[], T>> DynamicGroupBy<T>(this IEnumerable<T> data, string[] keys)
{
List<DGroupBy<T>> list = new List<DGroupBy<T>>();
foreach (var item in data.Select(x => new
{
k = keys.Select(y => x.GetType().GetProperty(y).GetValue(x, null)).ToArray(),
v = x
}))
{
DGroupBy<T> existing = list.SingleOrDefault(x => x.Key.Zip(item.k, (a, b) => a.Equals(b)).All(y => y));
if (existing == null)
{
existing = new DGroupBy<T>(item.k);
list.Add(existing);
}
existing.Add(item.v);
}
return list;
}
}
class Program
{
static void Main(string[] args)
{

var list = new List<User>()
{
new User(){ id=1,name="摘译",isOk=true},
new User(){ id=2,name="三孙",isOk=true},
new User(){ id=3,name="摘译",isOk=false},
new User(){ id=4,name="前额",isOk=true},
new User(){ id=5,name="三孙",isOk=false},
new User(){ id=6,name="摘译",isOk=true}
};
var query = list.DynamicGroupBy(new string[] { "name", "isOk" }).Select(c => new { c.Key, count = c.Count(), list = c });
}
class User
{
public int id { get; set; }
public string name { get; set; }
public bool isOk { get; set; }
}
}


分享
30 条评论
  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

正在拼了命为您加载…