【问题标题】:Which is better? DataTable.Select() or Linq for filtering objects?哪个更好? DataTable.Select() 或 Linq 用于过滤对象?
【发布时间】:2011-03-05 14:41:41
【问题描述】:

我正在存储自定义类类型的对象集合。我给出了下面的类型。

public class AnonymousClient
{
   private string ipAddress, city, country, category;
   private Guid id;
}

我可能需要根据城市、国家、类别等过滤对象。我可以想到两种方法 -

  1. 将其存储在字典中 Dictionary<Guid, AnonymousClient> 并使用 Linq 过滤 对象。
  2. 将其存储在DataTable 中 成员的多个列 并使用 DataTable.Select() 过滤记录。

我猜它们都在内部循环。哪个更快更优雅?有什么见解吗?

【问题讨论】:

标签: c# linq collections dictionary


【解决方案1】:

使用 DataTable 会增加相当多的开销。设置后运行查询会更容易,因为它的代码已经创建,但运行速度不会那么快。

如果您想使用id 查找项目,您可以使用Dictionary<Guid, AnonymousClient>,如果您只想过滤其他字段的数据,您可以使用List<AnonymousClient>

最有效的方法是自己简单地循环集合并挑选项目。 LINQ 几乎同样高效,但它增加了一点开销。另一方面,LINQ 代码变得非常简单。

使用LINQ扩展方法Where的示例:

var companies = clients.Where(c => c.category == "Company");

【讨论】:

  • 你能想到任何其他数据结构或方法来创建对象集合,以便我们可以过滤它而不会产生性能开销吗?
【解决方案2】:

我会采用第一种方法。但是您真的需要将它们存储在字典中吗?您已经将它们收藏在一个集合中,对吗?您可以使用 LINQ 对集合本身进行过滤。

var cityFiltered = from p in AnonymousClientList where p.city == 'London' select p;

等.. 并构建您的过滤集合。

======更新======

这是使用城市进行过滤的更新查询:

var filtered = (from c in clients where c.Value.city=="London" select c).ToDictionary(x => x.Key, x => x.Value);

如果您看到,第一部分基本上为您返回一个布尔值,而不是您需要的字典对象。通过使用 ToDictionary 方法,您可以转换回字典。因此,现在在执行 LINQ 之后,您将拥有所有城市设置为伦敦的 AnonymousClient。

【讨论】:

  • AnonymousClient 不是一个集合。它是对象类型。我正在存储 AnonymousClient 类型的对象集合。
  • 大多数情况下,我需要使用唯一 ID 从集合中访问对象。所以最好把它放在字典里,因为我可以直接把对象拿走,而不用 Linq 来做。
  • 是的,在这种特殊情况下,List 会比 Dictionary 慢。如果你用 id 查询更多,你可以去那个
  • 不幸的是,使用 Dictionary 比您想象的要麻烦。我认为您将不得不使用 List 本身。
  • 为什么会这样?有什么原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
相关资源
最近更新 更多