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("\t" + 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;
}
“fool me once,shame on you. fool me twice, shame on me.”,翻译过来的意思是“愚弄我一次,是你坏;愚弄我两次,是我蠢”。