C#中List自定义类的集合操作

例子:

    class User
    {
        public User(string a,string n)
        {
            Id = a;
            Name = n;
        }
        public string Id { get; set; }
        public string Name { get; set; }
    }
    class Program
    {
        public static void Main(string[] args)
        {
            List<User> list1 = new List<User>
            {
                new User("001","aa"),
                new User("001","aa"),
                new User("002","aa"),
                new User("003","aa"),
                new User("004","aa")
            };
            List<User> list2 = new List<User>
            {
                new User("001","aa"),
                new User("004","aa"),
                new User("005","aa"),
                new User("007","aa"),
                new User("008","aa")
            };
            List<User> list = list1.MyDistinct(s => s.Id).ToList();
            Console.WriteLine("去重:");
            foreach (var item in list)
            {
                Console.WriteLine(item.Id);
            }
            list = list1.MyExcept(list2, s => s.Id).ToList();
            Console.WriteLine("差集:");
            foreach (var item in list)
            {
                Console.WriteLine(item.Id);
            }
            list = list1.MyUnion(list2, s => s.Id).ToList();
            Console.WriteLine("并集:");
            foreach (var item in list)
            {
                Console.WriteLine(item.Id);
            }
            list = list1.MyIntersect(list2, s => s.Id).ToList();
            Console.WriteLine("交集:");
            foreach (var item in list)
            {
                Console.WriteLine(item.Id);
            }
            Console.ReadKey();
        }
    }

 

运行结果:

 

附源码:

    /// <summary>
    /// 集合帮助
    /// </summary>
    public static class SetOperationHelper
    {
        /// <summary>
        /// 去除source集合中重复的
        /// </summary>
        /// <typeparam name="T">要去重的对象类</typeparam>
        /// <typeparam name="C">自定义去重的字段类型</typeparam>
        /// <param name="source">要去重的对象</param>
        /// <param name="getfield">获取自定义去重字段的委托</param>
        /// <returns></returns>
        public static IEnumerable<T> MyDistinct<T, C>(this IEnumerable<T> source, Func<T, C> getfield)
        {
            return source.Distinct(new Compare<T, C>(getfield));
        }
        /// <summary>
        /// 差集,返回在source中存在,不在second中存在
        /// </summary>
        /// <typeparam name="T">对象类</typeparam>
        /// <typeparam name="C">字段</typeparam>
        /// <param name="source"></param>
        /// <param name="second"></param>
        /// <param name="getfield">获取自定义去重字段的委托</param>
        /// <returns></returns>
        public static IEnumerable<T> MyExcept<T, C>(this IEnumerable<T> source, IEnumerable<T> second, Func<T, C> getfield)
        {
            return source.Except(second, new Compare<T, C>(getfield));
        }
        /// <summary>
        /// 并集
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="C"></typeparam>
        /// <param name="source"></param>
        /// <param name="second"></param>
        /// <param name="getfield"></param>
        /// <returns></returns>
        public static IEnumerable<T> MyUnion<T, C>(this IEnumerable<T> source, IEnumerable<T> second, Func<T, C> getfield)
        {
            return source.Union(second, new Compare<T, C>(getfield));
        }
        /// <summary>
        /// 交集
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="C"></typeparam>
        /// <param name="source"></param>
        /// <param name="second"></param>
        /// <param name="getfield"></param>
        /// <returns></returns>
        public static IEnumerable<T> MyIntersect<T, C>(this IEnumerable<T> source, IEnumerable<T> second, Func<T, C> getfield)
        {
            return source.Intersect(second, new Compare<T, C>(getfield));
        }
    }

    public class Compare<T, C> : IEqualityComparer<T>
    {
        private readonly Func<T, C> _getField;
        public Compare(Func<T, C> getfield)
        {
            _getField = getfield;
        }
        public bool Equals(T x, T y)
        {
            return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y));
        }
        public int GetHashCode(T obj)
        {
            return EqualityComparer<C>.Default.GetHashCode(_getField(obj));
        }
    }

调用:

List<Entity> list = entities1.MyDistinct(s => s.Id).ToList();//根据自定义类中的ID字段去重。
List<Entity> list = entities1.MyExcept(entities2,s => s.Id).ToList();//根据自定义类中的ID字段,返回在ntities1中存在,不在entities2中存在。
List<Entity> list = entities1.MyUnion(entities2,s => s.Id).ToList();//根据自定义类中的ID字段,返回并集
List<Entity> list = entities1.MyIntersect(entities2,s => s.Id).ToList();//根据自定义类中的ID字段,返回交集

 

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 使用 jqGrid 4.6 自定义 treetable 可以使用以下步骤: 1. 首先,您需要定义一个模型,用于表示每个行的数据。您需要在模型添加一个名为 parent 的属性,以表示父节点。 ```csharp public class MyModel { public string Id { get; set; } public string Name { get; set; } public string Parent { get; set; } public bool IsLeaf { get; set; } public int Level { get; set; } public bool Expanded { get; set; } } ``` 2. 然后,您需要创建一个 List<MyModel> 对象,用于存储所有的行数据。 ```csharp List<MyModel> data = new List<MyModel>(); ``` 3. 接下来,您需要使用自定义函数来处理数据和构建树形表格。您可以使用自定义函数来读取数据、计算层级、构建树形表格以及处理展开和折叠等操作。 ```csharp // 读取数据并构建树形表格 public ActionResult MyAction() { // your data retrieval code here List<MyModel> rawData = GetDataFromDatabase(); // build tree data List<MyModel> treeData = new List<MyModel>(); foreach (MyModel node in rawData) { node.Level = 0; node.IsLeaf = true; node.Expanded = false; treeData.Add(node); foreach (MyModel child in rawData) { if (child.Parent == node.Id) { child.Level = node.Level + 1; child.IsLeaf = true; child.Expanded = false; treeData.Add(child); node.IsLeaf = false; } } } // set parent IDs foreach (MyModel node in treeData) { if (!string.IsNullOrEmpty(node.Parent)) { node.Parent = treeData.Find(n => n.Id == node.Parent).Id; } } // assign data to grid return Json(new { rows = treeData, page = 1, records = treeData.Count, total = 1 }, JsonRequestBehavior.AllowGet); } ``` 在上面的代码,我们首先使用 GetDataFromDatabase 函数从数据库获取原始数据。然后,我们使用一个 foreach 循环来遍历每个节点,计算层级并设置节点的 isLeaf 和 expanded 属性。在处理每个节点时,我们还使用另一个 foreach 循环来查找子节点,并将子节点添加到树形表格的数据。最后,我们设置每个节点的 parent 属性,使其与父节点的 ID 匹配。 4. 最后,您需要在视图文件使用 jqGrid 来显示树形表格。 ```javascript $("#myGrid").jqGrid({ url: "/MyController/MyAction", datatype: "json", colModel: [ { name: "Id", index: "Id", hidden: true }, { name: "Name", index: "Name", width: 150 }, { name: "Parent", index: "Parent", hidden: true }, { name: "IsLeaf", index: "IsLeaf", hidden: true }, { name: "Level", index: "Level", hidden: true }, { name: "Expanded", index: "Expanded", hidden: true }, ], treeGrid: true, treeGridModel: "adjacency", ExpandColumn: "Name", ExpandColClick: true, ExpandOnClick: true, treeIcons: { plus: "ui-icon-plus", minus: "ui-icon-minus", leaf: "ui-icon-document" }, caption: "My Tree Table Caption" }); ``` 在上面的代码,我们使用 jqGrid 的 url 选项来指定数据源的 URL。然后,我们使用 colModel 选项来定义数据列。接下来,我们使用 treeGrid 和 treeGridModel 选项来启用树形表格功能。最后,我们使用 ExpandColumn、ExpandColClick 和 ExpandOnClick 选项来设置展开和折叠操作的行为。 希望这可以帮助您开始构建自定义 treetable。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值