【问题标题】:How can find specific HashSet elements with linq如何使用 linq 找到特定的 HashSet 元素
【发布时间】:2015-12-08 07:00:25
【问题描述】:

我有字符串数组的 HashSet。一串数组类似于“2015-9-14 21:22:13”日期时间。如何将 DateTime.ParseExact 转换为 dateTime,然后使用 linq 从两个 dateTimes 之间的 HashSet 数组中查找所有时间。在我使用列表之前,但 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);
            }
        }

【问题讨论】:

  • 哈希集在这种情况下不会更快。甚至可能会慢一些。如果这是您使用哈希集的唯一原因,请保留列表。

标签: c# linq datetime hashset


【解决方案1】:

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

//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...() 方法。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 2020-06-18
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多