Aliens 2018-10-20 02:42 采纳率: 100%
浏览 3872
已采纳

C#中 list<object> 怎么去除重复的数据 ?

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);
                }
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择