如何检查可变长度字符串以查看它们是否以数组中的任何内容开头

本文关键字:是否 数组 开头 任何内 检查 字符串 何检查 | 更新日期: 2023-09-27 18:01:15

如果这个问题令人困惑,我深表歉意,因为我不太确定如何表达这个概念。

目前,我正在做的是以下几行作为 MySQL 语句,但是我正在将其迁移到 C# 中处理,并计划在直接处理数据而不是插入数据库并使用以下概念后将记录插入数据库:

$db->exec('UPDATE `' . date('Y-m',time() - self::DAYS_TO_MERGE) . '` SET `Cost`=0, `Location`=''Flat Rate World'' WHERE `Cost` IS NULL AND `Caller` IN (' . $FlatRateWO. ') AND SUBSTR(`Dialed`,1,7) IN (''0114021'',''0117095'');');
$db->exec('UPDATE `' . date('Y-m',time() - self::DAYS_TO_MERGE) . '` SET `Cost`=0, `Location`=''Flat Rate World'' WHERE `Cost` IS NULL AND `Caller` IN (' . $FlatRateWO. ') AND SUBSTR(`Dialed`,1,6) IN (''011420'',''011420'',''011852'',''011353'',''011353'',''011972'',''011972'',''011379'',''011379'',''011351'',''011351'',''011886'');');
$db->exec('UPDATE `' . date('Y-m',time() - self::DAYS_TO_MERGE) . '` SET `Cost`=0, `Location`=''Flat Rate World'' WHERE `Cost` IS NULL AND `Caller` IN (' . $FlatRateWO. ') AND SUBSTR(`Dialed`,1,5) IN (''01154'',''01154'',''01161'',''01161'',''01143'',''01143'',''01132'',''01132'',''01186'',''01186'',''01145'',''01145'',''01133'',''01133'',''01149'',''01149'',''01130'',''01130'',''01136'',''01136'',''01131'',''01131'',''01147'',''01148'',''01148'',''01182'',''01182'',''01165'',''01165'',''01134'',''01134'',''01141'',''01141'',''01146'',''01146'',''01166'',''01166'',''01144'');');
$db->exec('UPDATE `' . date('Y-m',time() - self::DAYS_TO_MERGE) . '` SET `Cost`=0, `Location`=''Flat Rate World'' WHERE `Cost` IS NULL AND `Caller` IN (' . $FlatRateWO. ') AND SUBSTR(`Dialed`,1,4) IN (''1787'');');

上面的 PHP 代码执行查询,并根据起始数字的长度按顺序排列,从最长的数字组开始。这意味着,0114021长度为 7 位,则在处理 6 位数字之前进行处理011420。这是为了防止0111234设置的价格与011123不同的情况。

此过程是 100% 工作的,但是它非常慢(平均约 0.63 秒/查询超过 100,000 条记录(。它的实际值来自一个 CSV 文件,我必须对其进行预处理,然后插入数据库,因此,如果我可以在插入之前对记录进行上述处理和计算,我想这将节省大量时间。

以下是上面转换为 C# 的数组:

World = new List<string>() { "0114021", "0117095", "011420", "011852", "011353", "011972", "011972", "011379", "011351", "011886", "01154", "01161", "01143", "01132", "01186", "01145", "01133", "01149", "01130", "01136", "01131", "01147", "01148", "01182", "01165", "01134", "01141", "01146", "01166", "01144", "01135", "1787" };

想知道的是,我如何有效地(尽可能(完成相同的任务,例如比较以下数字以查看它们是否以任何内容开头,World请记住,我希望首先返回最长的匹配项。

011353123456277 ... should match 011353  
011351334478399 ... should match 01135  
011326717788726 ... should match nothing -- not found.

刚刚尝试了以下代码,但没有成功:

    if ( World.All( s => "01197236718876321".Contains( s ) ) ) {
        MessageBox.Show( "found" );
    }

    if ( World.All( s => s.Contains("01197236718876321") ) ) {
        MessageBox.Show( "found" );
    }

使用此处的示例>使用 C# 检查字符串是否包含字符串数组中的字符串

第一个示例是使用嵌套foreach我想避免使用嵌套循环。Linq 的例子看起来不错,但我相信这个问题与我试图做的事情相反。


以下代码似乎有效,但是我不确定它是否遵守数组中项目的顺序。 似乎是,但想要确认,因为我不知道如何"观察"Linq的魔法内部发生的事情:

    string foundas = "";
    string number = "01197236718876321";
    if(World.Any( 
        b => {
            if(number.StartsWith(b)) {
                foundas = b;
                return true;
            } else {
                return false;
            }
        }
    ) ) {
        MessageBox.Show( foundas );
    }

旁白

我将跟进这个问题,因为下一部分有点复杂,我抓取一组费率(大约 10,000(,它们也按组的长度排序,但它们有一个"成本"字段我目前正在计算。

如何检查可变长度字符串以查看它们是否以数组中的任何内容开头

我会使用 StartsWith 检查所有命中,然后简单地获取结果中最长的字符串(通过聚合(。可能有一些更简单的东西然后聚合。

var hit = World.Where( s => source.StartsWith(s)).Aggregate(string.Empty, (max,cur)=> max.Length > cur.Length ? max :cur);
if(!string.IsNullOrEmpty(hit))
    MessageBox.Show( "found ");