zoukankan      html  css  js  c++  java
  • C#数组

    一、c# list如何实现动态分组

    转自:https://ask.csdn.net/questions/703207
    目前我只会对列表的固定的多个字段进行分组,能否实现让用户选择多个字段进行分组?不要使用条件列举所有选择情况,字段数很多,组合出的数量也很大,没有操作性。
    代码如下,RuleType, RuleLevel是两个分组字段,如何动态指定其他字段?使用表达式树构造lambda表达式是否可行?如何实现呢?谢谢!
    StatisticList = DataList.GroupBy(t => new { t.RuleType, t.RuleLevel})
    .Select(g => new Sta{
    Type = g.Key.RuleType,
    Level = g.Key.RuleLevel,
    ScoreTop = g.Sum(t => t.ScoreTop),
    }).ToList();

    ########完整代码如下:

       using System;
    using System.Collections.Generic;
    using System.Linq;
    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>>();
                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 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("	" + item1);
                }
            }
        }
    }
    

    二、c# 比较两个数组是否相同

     private bool CompareBytearrays(byte[] a,byte[] b)
            {
                if (a.Length != b.Length)
                    return false;
                int i = 0;
                foreach (byte c in a)
                {
                    if (c != b[i])
                        return false;
                    i++;
                }
                return true;
            }
    
  • 相关阅读:
    【leetcode 461】. Hamming Distance
    【leetcode 476】. Number Complement
    大数据概述
    对于编译原理的看法
    PHP基础(二) 文件包含
    PHP基础(一)
    webpack 之(6) commonJS和 ES6 Module区别 (未完成)
    webpack 之(5) webpack.config.js配置 之 img
    webpack 之(4) webpack.config.js配置 之 html
    webpack 之(3) webpack.config.js配置 之 css/less
  • 原文地址:https://www.cnblogs.com/newcapecjmc/p/11810768.html
Copyright © 2011-2022 走看看