2017-07-26 62 views
0

我需要檢查像奔來搜索多個部分列在一個巨大的字符串

A=1&AW=43&KO=96&R=7&WW=15&ZJ=80 

一個字符串的所有部件是否在一個大的字符串,如:

A=1&AG=77&AW=43&.....&KF=11&KO=96&.....&QW=55&R=7&....&WV=1&WW=15&....ZJ=80& 

我的代碼分割第一字符串&並使用Contains。但持續時間太長,因爲大字符串高達800000個字符。

對此有更好/更快的方法嗎?

public partial class UserDefinedFunctions 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlInt32 EquipmentCompare(SqlString equip, SqlString comp)   
    { 
     SqlInt32 result = 1; 

     if (comp.IsNull) 
     { 
      result = 1; 
     } 
     else 
     { 
      string equipment = "&" + equip.ToString(); 
      string compString = comp.ToString() + "! "; 

      while (compString.Length > 1) 
      { 
       string sub = compString.Substring(0, compString.IndexOf("!")); 
       compString = compString.Substring(compString.IndexOf("!")+1); 
       string[] elements = sub.Split('&'); 
       foreach (string i in elements) 
       { 
        if (i.StartsWith("~")) 
        { 
         if (equipment.Contains("&" + i.Substring(1) + "&")) 
         { 
          result = 0; 
          break; 
         } 
        } 
        else if (!equipment.Contains("&" + i + "&")) 
        { 
         result = 0; 
         break; 
        } 
        else 
        { 
         result = 1; 
         continue; 
        } 
       }   
       if (result == 1) 
       { 
        break; 
       } 
      } 
     } 
     return result;   
    } 
} 
+1

請顯示您的代碼。還需要多長時間?爲什麼它被認爲很慢? –

+0

明天我會發布 – jigga

回答

0

我想你可以通過使用HashSet來加速你的代碼。試試這個:

var str1 = "A=1&AW=43&KO=96&R=7&WW=15&ZJ=80"; 
var str2 = "A=1&AG=77&AW=43&.....&KF=11&KO=96&.....&QW=55&R=7&....&WV=1&WW=15&....ZJ=80&"; 

var largeStringSet = new HashSet<string>(str2.Split('&')); 
var allPartsIncluded = str1.Split('&').All(s => largeStringSet.Contains(s)); 
+0

忘了提及str1可能有字符「〜」,這是一個邏輯NOT和「|」爲邏輯或。明天我會發布我的代碼。也許問題會更清楚 – jigga

相關問題