如何使用 linq 查找特定的 HashSet 元素

How can find specific HashSet elements with linq

我有字符串数组的 HashSet。一串数组就像“2015-9-14 21:22:13”DateTime。如何将 DateTime.ParseExact 转换为 dateTime,然后使用 linq 从 HashSet 数组中查找两个 dateTime 之间的所有时间。在我使用列表之前,但 HashSet 在搜索元素时具有更好的性能,现在我更改我的代码以使用 HashSet。

这是我的旧代码列表:

foreach (var infos in this.InfoFromDatabase)
        {
            thisTime = DateTime.ParseExact(infos[5], "yyyy-M-d H:m:s", null);

            // if is in this diapazon time add in list
            if (thisTime > minimumDateTime && thisTime < maximumDateTime)
            {
                allInformation.Add(infos);
            }
        }

A​​ HashSet 仅在您需要准确检查该元素时才有意义(或更好:使用 GetHashCode() 返回的相同值)。在您的情况下,您只需搜索所有数据,它仅在原始字符串块中可用。所以哈希集不会给你任何性能改进。

由于您将变量命名为 InfoFromDatabase 并且您知道必须将数组中的元素 5 解析为日期时间,因此每个数组中似乎都有一个结构。因此,也许您应该创建一个 class ,其中包含数组中每个元素的各个属性,并且它将在构造函数中获得这样一个数组。在这里您可以解析数组并填充属性。现在您可以用您的对象填写一个列表,并轻松检查它们是否符合您的条件。

不幸的是,通过在内存中构建这样的结构,您无法提高性能(也许懒惰地初始化给定数组中的 属性 值),但我会跳过此类优化,直到您测量一个性能瓶颈。在这种情况下,请返回您的具体性能问题,SO 一定会帮助您解决它。

如果您只是在寻找 LINQ,那么就在这里。它适用于任何 IEnumerable<string[]>(哈希集和列表):

//Assuming that 
//IEnumerable<string[]> this.InfoFromDatabase

var allInformation = this.InfoFromDatabase.Where(i =>
{
    var thisTime = DateTime.ParseExact(i[5], "yyyy-M-d H:m:s", null);
    return thisTime > minimumDateTime && thisTime < maximumDateTime;
});

如果需要,您可以对结果调用 ToList() 或任何其他 To...() 方法。