最近我遇到了一个问题,我的团队和我需要按条件对对象列表进行分组,然后再按更多的条件进行分组,接着再按更多的条件进行分组,等等,一共进行7个或者更多级别的分组。经过几天的思考后,我最终想出了一种树形结构,尽管每一级都是手动定义的(主要是为了便于阅读,因为一旦编程完成,它就会不变)。如何处理这个问题是最好的方法,如果可能的话,为什么?
以下是使用随机整数列表的示例代码。检查的顺序是:先判断是否可被2整除,然后是否可被3整除,最后是否可被5整除(尽管条件的顺序对需求没有影响)。
这里是包含随机整数列表和TopNode类的代码:
这是顶层节点类的其余代码。
以下是使用随机整数列表的示例代码。检查的顺序是:先判断是否可被2整除,然后是否可被3整除,最后是否可被5整除(尽管条件的顺序对需求没有影响)。
这里是包含随机整数列表和TopNode类的代码:
Random rand = new Random();
List<int> ints = new List<int>();
for (int i = 0; i < 10; i++)
{
ints.Add(rand.Next(0, 10000001));
}
TopNode node = new TopNode(ints);
这是顶层节点类的其余代码。
public class TopNode
{
public Even Even { get; set; }
public Odd Odd { get; set; }
public TopNode(List<int> ints)
{
var even = ints.Where(x => x % 2 == 0).ToList();
var odd = ints.Where(x => x % 2 != 0).ToList();
if (even.Count > 0)
{
Even = new Even(even);
}
if (odd.Count > 0)
{
Odd = new Odd(odd);
}
}
}
public class Even {
public Mulitple3 Mulitple3 { get; set; }
public NotMulitple3 NotMulitple3 { get; set; }
public Even(List<int> ints)
{
var multiple = ints.Where(x => x % 3 == 0).ToList();
var not = ints.Where(x => x % 3 != 0).ToList();
if (multiple.Count > 0)
{
Mulitple3 = new Mulitple3(multiple);
}
if (not.Count > 0)
{
NotMulitple3 = new NotMulitple3(not);
}
}
}
public class Odd {
public Mulitple3 Mulitple3 { get; set; }
public NotMulitple3 NotMulitple3 { get; set; }
public Odd(List<int> ints)
{
var multiple = ints.Where(x => x % 3 == 0).ToList();
var not = ints.Where(x => x % 3 != 0).ToList();
if (multiple.Count > 0)
{
Mulitple3 = new Mulitple3(multiple);
}
if (not.Count > 0)
{
NotMulitple3 = new NotMulitple3(not);
}
}
}
public class Mulitple3
{
public Multiple5 Multiple5 { get; set; }
public NotMultiple5 NotMultiple5 { get; set; }
public Mulitple3(List<int> ints)
{
var multiple = ints.Where(x => x % 5 == 0).ToList();
var not = ints.Where(x => x % 5 != 0).ToList();
if (multiple.Count > 0)
{
Multiple5 = new Multiple5(multiple);
}
if (not.Count > 0)
{
NotMultiple5 = new NotMultiple5(not);
}
}
}
public class NotMulitple3
{
public Multiple5 Multiple5 { get; set; }
public NotMultiple5 NotMultiple5 { get; set; }
public NotMulitple3(List<int> ints)
{
var multiple = ints.Where(x => x % 5 == 0).ToList();
var not = ints.Where(x => x % 5 != 0).ToList();
if (multiple.Count > 0)
{
Multiple5 = new Multiple5(multiple);
}
if (not.Count > 0)
{
NotMultiple5 = new NotMultiple5(not);
}
}
}
public class Multiple5
{
public List<int> ints { get; set; }
public Multiple5(List<int> ints)
{
this.ints = ints;
}
}
public class NotMultiple5
{
public List<int> ints { get; set; }
public NotMultiple5(List<int> ints)
{
this.ints = ints;
}
}
List<T>
并使用 LINQ 的GroupBy
进行分组。这样编写最容易,最容易理解,最容易应对不断变化的要求,并且可以处理大量内存中的数据,如果需要的话还可以转换为数据库查询。永远不要低估优化代码扫描简单数据结构所具备的暴力速度,相比于在一些“聪明”的指针网络中跳来跳去的内存操作。 - Ian Mercerints.Where(i => i.IsEven).Where(i => i.IsAMultipleOf3)
非常容易使用、修改和理解。如果我们更好地了解您的用例,那么建议更好的东西将更容易。这也很容易从中获取层次结构,因此我很难看出层次结构的目的是什么。 - Kyle W