C#中 list 怎么去除重复的数据 ?object可能是类等复杂类型。谢谢!
1条回答 默认 最新
- threenewbee 2018-10-20 03:04关注
用distinct 方法
之前的程序我用表达式代替反射,给你写了一下:
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace Q703207 { 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>>(); var exps = keys.Select(x => { var para = Expression.Parameter(typeof(T), "p"); Expression<Func<T, object>> GetProp = Expression.Lambda<Func<T, object>>( Expression.MakeMemberAccess(para, typeof(T).GetProperty(x)), para) as Expression<Func<T, object>>; return GetProp.Compile(); }).ToArray(); foreach (var item in data.Select(x => new { k = exps.Select(y => y(x)).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 User { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public string City { get; set; } public override string ToString() { return string.Format("{0},{1},{2},{3}", ID, Name, Age ,City); } } class Program { static void Main(string[] args) { List<User> users = new List<User>() { new User() { ID = 1, Age = 20, City = "BJ", Name = "A" }, new User() { ID = 2, Age = 20, City = "BJ", Name = "B" }, new User() { ID = 3, Age = 20, City = "BJ", Name = "C" }, new User() { ID = 4, Age = 20, City = "SH", Name = "D" }, new User() { ID = 5, Age = 30, City = "SH", Name = "E" }, new User() { ID = 6, Age = 30, City = "SH", Name = "F" }, new User() { ID = 7, Age = 30, City = "CD", Name = "G" }, new User() { ID = 8, Age = 30, City = "CD", Name = "H" }, new User() { ID = 9, Age = 30, City = "HK", Name = "I" }, new User() { ID = 10, Age = 30, City = "HK", Name = "J" }, }; var query = users.DynamicGroupBy(new string[] { "City" }); foreach (var item in query) { Console.WriteLine("Key: {0}", string.Join(",", item.Key.Select(x => x.ToString()))); foreach (var item1 in item) Console.WriteLine("\t" + item1); } } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
- ¥15 Android studio AVD启动不了
- ¥15 陆空双模式无人机怎么做
- ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
- ¥15 C#中的编译平台的区别影响
- ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
- ¥15 电脑蓝屏logfilessrtsrttrail问题
- ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
- ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
- ¥15 Java+vue部署版本反编译