【问题标题】:C# Match CSV StringC# 匹配 CSV 字符串
【发布时间】:2014-11-19 00:25:03
【问题描述】:

我试图弄清楚如何编写一个 C# 函数,如果两个字符串之间存在“匹配”,则该函数返回 true。字符串中的数字将始终按升序排序。

string1: 1,3
string2: 1,2,3

如果 string1 中的所有数字都在 string2 中找到,则该函数应返回 true。在上面的示例中,返回值应该为 true。

string1: 1,2,4
string2: 1,2,3

在上面的示例中,返回 false 应该是 false,因为不是 string1 中的所有数字都在 string2 中找到。

string1 的基本情况是一个空字符串,无论string2 包含什么内容,都应该始终返回 true。

我正在考虑将两个字符串拆分为数组并尝试进行匹配,并且也会对正则表达式选项感兴趣。接受您可能有的任何想法。

我可以编写函数,所以真的只是在寻找“最佳”方法的想法来完成这个。 “最佳”是指您认为性能最快的选项(是的,我会在投入生产之前测试我的硬件的性能)。

如果有帮助的话,字符串中最多有 10 个数字。我们永远不会看到包含数百个数字的字符串。

【问题讨论】:

  • homework.stackexchange.com?
  • 所以您要的是性能最快的那个(我喜欢这句话),但您可以编写自己的函数并且无论如何都要测试它们?您对我们有什么期望?
  • "字符串中最多有 10 个数字。"那你为什么要担心性能呢?
  • @user2023861 这个方法可能会在生产环境中执行很多次
  • 我正在寻找实现这一目标的方法的想法。我不需要人来编写函数定义、if/then 逻辑等。只是寻找如何最好地完成任务的想法。

标签: c# regex string csv match


【解决方案1】:

如果格式是严格的并且你不能有 1, "1,2,3", 2 这样的东西,你可以使用 String.Split 和 LINQ:

bool allInOneInTwo = !string1.Split(',').Except(string2.Split(',')).Any();

Enumerable.Except返回两个序列的集合差,效率很高。因为它是惰性执行的,Enumerable.Any 将在第一场比赛中返回。

既然您提到它必须是高效的,因为它每天执行多达 100k 次,并且您预计最多需要不到几秒钟:上面的示例只需要 140 毫秒 在我的 PC 上执行 100k 次。但是两个数组都非常小。 Except 如果它们更大,会产生更大的差异。

【讨论】:

  • 仅供参考,string.Split() 更新其子字符串,因此需要分配内存。如果您首先关心的是性能,那么您绝对可以在没有 string.Split() 的情况下执行此操作。代码不会那么可读,但它会避免内存分配。您只需逐个字符地遍历每个字符串,直到找到您不期望的数字或字符串的结尾。
  • @user2023861:首先,OP 提到“大多数会有 10 个数字”。另外,现在不要高估内存的成本。您通常拥有足够多的资源,通过使用它,您可以使用上述基于性能集的方法。
猜你喜欢
  • 2011-05-28
  • 2010-09-30
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多