2008-10-30 52 views
3

对不起,如果我不熟悉我的术语,我只有大约2.4年的编程经验,主要是.NET。自定义集合 - 仍然值得额外的工作?

目前我在一台主机铺二根.NET开发人员之一,其他开发者设定的标准,是一个伟大的编码器有很多更多的经验,再加上一个CS学位(我是100%的自我学习)。

我们使用自定义集合为每一种应用,最近因为.NET 2.0,我使用泛型代替的ArrayList得到了他,和眼球的表现,他们似乎做的很好。我们开发了一个自动化程序,它使用SQLDMO连接到数据库,并为我们想要的任何对象创建基本数据层和业务层,并处理逻辑删除等。

当性能是你最优化的时候,你何时可以证明不使用自定义集合并为它编写自定义排序?目前我们使用硬编码排序,因为我们看到的所有内容都比较慢,因为大多数其他选项都使用反射或臃肿数据集/ LINQ(与定制集合相比,它仍然比一年前慢)。

是否有其他人严格使用自定义泛型集合而不是简单的路线?性能的牺牲是否与我一直相信的那样重要?因为我仍然处于自己的发展生涯的初级阶段,所以我认为下一个合乎逻辑的步骤就是让我自己开始进行基准测试,但我也希望得到其他专业人士的意见......所以,其他人都这样做吗?是唯一一个真正严格使用自定义集合的人,他们可以更快更轻松地创建解决方案吗?

所有意见将不胜感激。

编辑:对于术语的抱歉,我知道我会得到一些小东西。我定义集合的含义确实是使用自定义类和继承List(Of T)的自定义集合类,并且还实现了IComparable来处理排序。

+0

通过“自定义集合”你的意思是创建从System.Collections.CollectionBase派生的类? – 2008-10-30 04:56:48

回答

4

说到优化和集合,您应该先看看算法的复杂性。

一个简单的例子是 - 如果你有对象的列表,你一直在寻找的东西了在该列表中,并且它得到相当大的,那么你可能会更好用字典来代替。字典查找与列表(在O(log n)和O(1)之间,而不是O(n))具有不同的查找复杂度保证。

这是值得让自己熟悉各种集合类的算法复杂度,如果你还没有这样做的话(如果你用它完全陌生,check out the wikipedia article

如果您使用的是相关联的集合,就像Dictionary一样,你也应该检查你是否在集合中的对象上使用GetHashCode()的最佳实现。

.Net的问题(警告:我到目前为止只使用了.Net 2.0)是因为他们没有很好的收集类别,他们的复杂性保证并不像他们应该那样广为人知。

个人而言,我增加我的收藏凭借着出色的PowerCollections,增加了集和MultiDictionaries,等等。这为您提供了更多选择工具,这意味着您可以在更多时间选择正确的选项。

至今我还没有遇到过由于性能不佳(或PowerCollection)集合(除旧版本,通用版本之外)而不得不编写定制集合类的情况。我的感觉是,如果确定自己使用的是正确的复杂性并进行了配置,那么发现它们仍然不够高性能,那么.Net并不是您的应用程序的最佳选择。因人而异。

2

我总是使用泛型集合。我偶尔会从现有的泛型类派生自己的集合类,以添加自己的方法和行为,但它仍然是通用的。如果性能是一个问题,你可能不会使用内置的集合类。

2

我个人使用那里的标准通用集合,最常见的是List和Dictionary。如果可能,我尝试在数据库中进行排序,因为我发现它更容易管理。

我没有看到真正需要自定义集合的位置,也不会提供性能改进,并且使其不太熟悉实现。

自定义集合在2.0

+0

那么像LINQ这样的东西有什么意义呢?如果表现是大多数人仍然在使用泛型和类? – thismat 2008-10-30 12:59:25

+0

这是一个很好的观点,我不使用LINQ,而且我们也没有计划,因为我们处理的数据量太大,因此我们必须对数据恢复进行其他优化,而LINQ to SQL只是不会削减数据。我们可能会在其他地方使用它,比如在某个时间搜索/排序,但是... – 2008-10-30 19:12:01

3

我建议在开发初期使用标准的通用集合了很多比较常见的引入泛型之前。如果您稍后发现性能瓶颈,则可以使用自己的自定义集合重新设计。为了解释Code Complete的作者史蒂夫麦康奈尔,人类在估计性能方面表现出色。除非你确切知道这个类和它的方法会被访问多少,否则它不值得使用optomising。

4

我也使用通用的列表或字典,但我经常根据通用的类创建自己的类。所以我可以定义一个class CustomerList : List<Customer>。这允许我为类添加自定义功能,并且如果需要的话,它还使我可以轻松地将其替换为自定义实现。在接口使用时,因为你必须在他们如何能够比你使用标准的集合可以使用更多的控制

+0

here here!此外,定义您自己的自定义类允许创建不同集合的过载ctors。和客户端代码可以读取更清洁... CustomerList customersInarrears = new CustomerList(TimeSpan AcctOverdueThreshold); – 2008-11-17 00:28:18

1

自定义集合可能有优势。但是,一定要始终返回一个接口,而不是具体的类。这样,用户不必关心集合类的类型,并且可以在不中断接口的情况下更改实际类型。

在大多数情况下,使用其中一个默认集合将会很好。

1

现在,随着.NET 3.5的日子里,我使用泛型集合类(列表,字典),如果我需要添加到这些收集我使用扩展方法的逻辑。例如:

public static class Extensions 
{ 
    public static Customer GetCustomerByName(this List<Customer> customers) 
    { 
    … 
    return customer; 
    } 
} 

var customers = new List<Customer>(); 
customers.Add(new Customer()); 
var customer = customers.GetCustomerByName(“Smith”);