我想比较一些列表(最多10个)并输出一个比较表,显示列表中存在哪些项目。
说我有3个名单
A{ item1, item2, item3}
B{ item2}
C{ item4, item 1 }
我想要一张表格,将A,B,C中的所有不同项目显示为行 列表名称为列 在网格内部,我想要一个真/假显示该项是否存在于该列的列表中。
在html或c#中有一种简单的方法吗? (即时通讯使用.net mvc) 非常感谢!
编辑:抱歉模棱两可。我仍在考虑最好的方法。 我现在拥有的: 包含不同列表列表的模型
public class CompareModel
{
public List<Tree> trees{ get; set; }
public string someotherinfo1 { get; set; }
public string someotherinfo2{ get; set; }
}
public class Tree
{
public List<item> items{ get; set; }
public int treeid{ get; set; }
public string treename{ get; set; }
}
public class Item
{
public int itemid{ get; set; }
public string itemname{ get; set; }
}
所以现在我有一个传递给View的'Compare'模型,比如3 Tree,每个都包含一些项目。
我想问的是,我如何编写一个模型视图,比较哪个项目存在于哪个树中,而哪个项目不存在于哪个列表中,使用true和false表示哪个列表。
html中有这样的东西:
| A | B | C |
item1 | T | F | T |
item2 | T | T | F |
item3 | T | F | F |
item4 | F | F | T |
提到的列是树的项目的联合。网格内的真/假怎么样?现在我正在考虑一种直接的方法:
foreach (Tree t in trees){
foreach (Item i in UnionedItemList){
result = t.items.Contains(i);
//Display result
}
}
有没有更好的方法呢?因为在真实情况下我每棵树会有90个项目。如果一切都是不同的,我将不得不运行.Contains()270次。有更快的方法吗?非常感谢!
答案 0 :(得分:0)
您将不必担心性能与您将拥有的树/项目一样少。如果你有10棵树,每个有90个项目,那么就会有900个调用contains,它必须遍历树中的每个项目(90个项目),在你的代码中进行总共81K的比较。你的机器是以GHz的速度测量的,所以运行它应该花费你不会注意到的一小部分时间。该算法的big-O表示法是O(m * n ^ 2),其中m是树的数量,n是树的大小。这对于小m和n(你相对来说)来说并不算太糟糕。
如果这是一个网站,速度确实成为一个问题,你可以采取一些方法,但是看看缓存这个输出可能更容易/更好,而不是让计算更快。
如果您确实需要加快速度,那么您可以做些事情。一个潜在的优化方法是,而不是在UnionedItemList
上调用.Contains
,在t
上调用UnionedItemList
,使t.items
成为哈希表(字典),然后迭代UnionedItemList
设置相应的{{1}}中的值。从理论上讲,这只是O(m * n),在你的情况下仅调用900次比较,但缺点是增加了复杂性,并且在这种规模下,使用哈希表的开销可能比你的方式更糟糕。这样做。