Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何计算子字符串出现的次数?_C#_String - Fatal编程技术网

C# 如何计算子字符串出现的次数?

C# 如何计算子字符串出现的次数?,c#,string,C#,String,假设我有一个字符串,如: MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com"; 然后我想知道子字符串“OU=”在这个字符串中出现了多少次。对于单字符,可能有如下内容: int count = MyString.Split("OU=").Length - 1; 但是Split仅适用于char,而不适用于string 还有,如何找到n个引用的位置?例如,第二个“OU=“在字符串中的位置 如何解决此问题?下面应该可以解决 Rege

假设我有一个字符串,如:

MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
然后我想知道子字符串“OU=”在这个字符串中出现了多少次。对于单字符,可能有如下内容:

int count = MyString.Split("OU=").Length - 1;
但是
Split
仅适用于
char
,而不适用于
string

还有,如何找到n个引用的位置?例如,第二个
“OU=“
在字符串中的位置

如何解决此问题?

下面应该可以解决

Regex.Matches(input, "OU=").Count
  MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
  int count = Regex.Matches(MyString, "OU=").Count

您可以使用
IndexOf
找到所有引用及其位置:

string MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
string stringToFind = "OU=";

List<int> positions = new List<int>();
int pos = 0;
while ((pos < MyString.Length) && (pos = MyString.IndexOf(stringToFind, pos)) != -1)
{
    positions.Add(pos);
    pos += stringToFind.Length();
}

Console.WriteLine("{0} occurrences", positions.Count);
foreach (var p in positions)
{
    Console.WriteLine(p);
}
主要区别是:

  • 正则表达式代码更短
  • 正则表达式代码分配一个集合和多个字符串
  • 可以编写IndexOf代码以立即输出位置,而无需创建集合
  • 单独使用Regex代码可能会更快,但如果多次使用,字符串分配的组合开销可能会导致垃圾收集器上的负载更高
如果我在线写这篇文章,作为一种不经常使用的东西,我可能会使用正则表达式解决方案。如果我把它作为经常使用的东西放入库中,我可能会选择IndexOf解决方案。

(Clippy模式:ON

看起来您正在解析LDAP查询

是否要对其进行分析:

  • 手动?转到“拆分和解析”
  • 自动通过Win32调用?转到“通过PInvoke使用Win32”
(剪辑模式:关闭

“拆分和解析”:

var MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
var chunksAsKvps = MyString
    .Split(',')
    .Select(chunk => 
        { 
            var bits = chunk.Split('='); 
            return new KeyValuePair<string,string>(bits[0], bits[1]);
        });

var allOUs = chunksAsKvps
    .Where(kvp => kvp.Key.Equals("OU", StringComparison.OrdinalIgnoreCase));
公用事业代码:

// I don't remember where I got this from, honestly...I *think* it came
// from another SO user long ago, but those details I've lost to history...
public class Win32LDAP
{
   #region Constants
   public const int ERROR_SUCCESS = 0;
   public const int ERROR_BUFFER_OVERFLOW = 111;
   #endregion Constants

   #region DN Parsing
   [DllImport("ntdsapi.dll", CharSet = CharSet.Unicode)]
   protected static extern int DsGetRdnW(
       ref IntPtr ppDN, 
       ref int pcDN, 
       out IntPtr ppKey, 
       out int pcKey, 
       out IntPtr ppVal, 
       out int pcVal
   );

   public static KeyValuePair<string, string> GetName(string distinguishedName)
   {
       IntPtr pDistinguishedName = Marshal.StringToHGlobalUni(distinguishedName);
       try
       {
           IntPtr pDN = pDistinguishedName, pKey, pVal;
           int cDN = distinguishedName.Length, cKey, cVal;

           int lastError = DsGetRdnW(ref pDN, ref cDN, out pKey, out cKey, out pVal, out cVal);

           if(lastError == ERROR_SUCCESS)
           {
               string key, value;

               if(cKey < 1)
               {
                   key = string.Empty;
               }
               else
               {
                   key = Marshal.PtrToStringUni(pKey, cKey);
               }

               if(cVal < 1)
               {
                   value = string.Empty;
               }
               else
               {
                   value = Marshal.PtrToStringUni(pVal, cVal);
               }

               return new KeyValuePair<string, string>(key, value);
           }
           else
           {
               throw new Win32Exception(lastError);
           }
       }
       finally
       {
           Marshal.FreeHGlobal(pDistinguishedName);
       }
   }

   public static IEnumerable<KeyValuePair<string, string>> ParseDN(string distinguishedName)
   {
       List<KeyValuePair<string, string>> components = new List<KeyValuePair<string, string>>();
       IntPtr pDistinguishedName = Marshal.StringToHGlobalUni(distinguishedName);
       try
       {
           IntPtr pDN = pDistinguishedName, pKey, pVal;
           int cDN = distinguishedName.Length, cKey, cVal;

           do
           {
               int lastError = DsGetRdnW(ref pDN, ref cDN, out pKey, out cKey, out pVal, out cVal);

               if(lastError == ERROR_SUCCESS)
               {
                   string key, value;

                   if(cKey < 0)
                   {
                       key = null;
                   }
                   else if(cKey == 0)
                   {
                       key = string.Empty;
                   }
                   else
                   {
                       key = Marshal.PtrToStringUni(pKey, cKey);
                   }

                   if(cVal < 0)
                   {
                       value = null;
                   }
                   else if(cVal == 0)
                   {
                       value = string.Empty;
                   }
                   else
                   {
                       value = Marshal.PtrToStringUni(pVal, cVal);
                   }

                   components.Add(new KeyValuePair<string, string>(key, value));

                   pDN = (IntPtr)(pDN.ToInt64() + UnicodeEncoding.CharSize); //skip over comma
                   cDN--;
               }
               else
               {
                   throw new Win32Exception(lastError);
               }
           } while(cDN > 0);

           return components;
       }
       finally
       {
           Marshal.FreeHGlobal(pDistinguishedName);
       }
   }

   [DllImport("ntdsapi.dll", CharSet = CharSet.Unicode)]
   protected static extern int DsQuoteRdnValueW(
       int cUnquotedRdnValueLength,
       string psUnquotedRdnValue,
       ref int pcQuotedRdnValueLength,
       IntPtr psQuotedRdnValue
   );

   public static string QuoteRDN(string rdn)
   {
       if (rdn == null) return null;

       int initialLength = rdn.Length;
       int quotedLength = 0;
       IntPtr pQuotedRDN = IntPtr.Zero;

       int lastError = DsQuoteRdnValueW(initialLength, rdn, ref quotedLength, pQuotedRDN);

       switch (lastError)
       {
           case ERROR_SUCCESS:
               {
                   return string.Empty;
               }
           case ERROR_BUFFER_OVERFLOW:
               {
                   break; //continue
               }
           default:
               {
                   throw new Win32Exception(lastError);
               }
       }

       pQuotedRDN = Marshal.AllocHGlobal(quotedLength * UnicodeEncoding.CharSize);

       try
       {
           lastError = DsQuoteRdnValueW(initialLength, rdn, ref quotedLength, pQuotedRDN);

           switch(lastError)
           {
               case ERROR_SUCCESS:
                   {
                       return Marshal.PtrToStringUni(pQuotedRDN, quotedLength);
                   }
               default:
                   {
                       throw new Win32Exception(lastError);
                   }
           }
       }
       finally
       {
           if(pQuotedRDN != IntPtr.Zero)
           {
               Marshal.FreeHGlobal(pQuotedRDN);
           }
       }
   }


   [DllImport("ntdsapi.dll", CharSet = CharSet.Unicode)]
   protected static extern int DsUnquoteRdnValueW(
       int cQuotedRdnValueLength,
       string psQuotedRdnValue,
       ref int pcUnquotedRdnValueLength,
       IntPtr psUnquotedRdnValue
   );

   public static string UnquoteRDN(string rdn)
   {
       if (rdn == null) return null;

       int initialLength = rdn.Length;
       int unquotedLength = 0;
       IntPtr pUnquotedRDN = IntPtr.Zero;

       int lastError = DsUnquoteRdnValueW(initialLength, rdn, ref unquotedLength, pUnquotedRDN);

       switch (lastError)
       {
           case ERROR_SUCCESS:
               {
                   return string.Empty;
               }
           case ERROR_BUFFER_OVERFLOW:
               {
                   break; //continue
               }
           default:
               {
                   throw new Win32Exception(lastError);
               }
       }

       pUnquotedRDN = Marshal.AllocHGlobal(unquotedLength * UnicodeEncoding.CharSize);

       try
       {
           lastError = DsUnquoteRdnValueW(initialLength, rdn, ref unquotedLength, pUnquotedRDN);

           switch(lastError)
           {
               case ERROR_SUCCESS:
                   {
                       return Marshal.PtrToStringUni(pUnquotedRDN, unquotedLength);
                   }
               default:
                   {
                       throw new Win32Exception(lastError);
                   }
           }
       }
       finally
       {
           if(pUnquotedRDN != IntPtr.Zero)
           {
               Marshal.FreeHGlobal(pUnquotedRDN);
           }
       }
   }
   #endregion DN Parsing
}

public class DNComponent
{
   public string Type { get; protected set; }
   public string EscapedValue { get; protected set; }
   public string UnescapedValue { get; protected set; }
   public string WholeComponent { get; protected set; }

   public DNComponent(string component, bool isEscaped)
   {
       string[] tokens = component.Split(new char[] { '=' }, 2);
       setup(tokens[0], tokens[1], isEscaped);
   }

   public DNComponent(string key, string value, bool isEscaped)
   {
       setup(key, value, isEscaped);
   }

   private void setup(string key, string value, bool isEscaped)
   {
       Type = key;

       if(isEscaped)
       {
           EscapedValue = value;
           UnescapedValue = Win32LDAP.UnquoteRDN(value);
       }
       else
       {
           EscapedValue = Win32LDAP.QuoteRDN(value);
           UnescapedValue = value;
       }

       WholeComponent = Type + "=" + EscapedValue;
   }

   public override bool Equals(object obj)
   {
       if (obj is DNComponent)
       {
           DNComponent dnObj = (DNComponent)obj;
           return dnObj.WholeComponent.Equals(this.WholeComponent, StringComparison.CurrentCultureIgnoreCase);
       }
       return base.Equals(obj);
   }

   public override int GetHashCode()
   {
       return WholeComponent.GetHashCode();
   }
}

public class DistinguishedName
{
   public DNComponent[] Components
   {
       get
       {
           return components.ToArray();
       }
   }

   private List<DNComponent> components;
   private string cachedDN;

   public DistinguishedName(string distinguishedName)
   {
       cachedDN = distinguishedName;
       components = new List<DNComponent>();
       foreach (KeyValuePair<string, string> kvp in Win32LDAP.ParseDN(distinguishedName))
       {
           components.Add(new DNComponent(kvp.Key, kvp.Value, true));
       }
   }

   public DistinguishedName(IEnumerable<DNComponent> dnComponents)
   {
       components = new List<DNComponent>(dnComponents);
       cachedDN = GetWholePath(",");
   }

   public bool Contains(DNComponent dnComponent)
   {
       return components.Contains(dnComponent);
   }

   public string GetDNSDomainName()
   {
       List<string> dcs = new List<string>();
       foreach (DNComponent dnc in components)
       {
           if(dnc.Type.Equals("DC", StringComparison.CurrentCultureIgnoreCase))
           {
               dcs.Add(dnc.UnescapedValue);
           }
       }
       return string.Join(".", dcs.ToArray());
   }

   public string GetDomainDN()
   {
       List<string> dcs = new List<string>();
       foreach (DNComponent dnc in components)
       {
           if(dnc.Type.Equals("DC", StringComparison.CurrentCultureIgnoreCase))
           {
               dcs.Add(dnc.WholeComponent);
           }
       }
       return string.Join(",", dcs.ToArray());
   }

   public string GetWholePath()
   {
       return GetWholePath(",");
   }

   public string GetWholePath(string separator)
   {
       List<string> parts = new List<string>();
       foreach (DNComponent component in components)
       {
           parts.Add(component.WholeComponent);
       }
       return string.Join(separator, parts.ToArray());
   }

   public DistinguishedName GetParent()
   {
       if(components.Count == 1)
       {
           return null;
       }
       List<DNComponent> tempList = new List<DNComponent>(components);
       tempList.RemoveAt(0);
       return new DistinguishedName(tempList);
   }

   public override bool Equals(object obj)
   {
       if(obj is DistinguishedName)
       {
           DistinguishedName objDN = (DistinguishedName)obj;
           if (this.Components.Length == objDN.Components.Length)
           {
               for (int i = 0; i < this.Components.Length; i++)
               {
                   if (!this.Components[i].Equals(objDN.Components[i]))
                   {
                       return false;
                   }
               }
               return true;
           }
           return false;
       }
       return base.Equals(obj);
   }

   public override int GetHashCode()
   {
       return cachedDN.GetHashCode();
   }
}
//老实说,我不记得这是从哪里来的……我想它是从哪里来的
//很久以前从另一个用户那里得到的,但这些细节我已经被历史遗忘了。。。
公共类Win32LDAP
{
#区域常数
public const int ERROR_SUCCESS=0;
public const int ERROR_BUFFER_OVERFLOW=111;
#端区常数
#区域DN解析
[DllImport(“ntdsapi.dll”,CharSet=CharSet.Unicode)]
受保护的静态外部int DsGetRdnW(
参考IntPtr ppDN,
参考int pcDN,
输出IntPtr ppKey,
out int pcKey,
输出IntPtr ppVal,
out int pcVal
);
public static KeyValuePair GetName(字符串区分名称)
{
IntPtr pDistinguishedName=Marshal.StringToHGlobalUni(区分名称);
尝试
{
IntPtr pDN=pDistinguishedName,pKey,pVal;
int cDN=区分名称.长度,cKey,cVal;
int lastError=DSGETRNW(参考pDN、参考cDN、输出pKey、输出cKey、输出pVal、输出cVal);
如果(lastError==错误\u成功)
{
字符串键,值;
if(cKey<1)
{
key=string.Empty;
}
其他的
{
key=Marshal.PtrToStringUni(pKey,cKey);
}
if(cVal<1)
{
value=string.Empty;
}
其他的
{
值=Marshal.PtrToStringUni(pVal,cVal);
}
返回新的KeyValuePair(键,值);
}
其他的
{
抛出新的Win32Exception(lastError);
}
}
最后
{
FreeHGlobal元帅(pDistinguishedName);
}
}
公共静态IEnumerable ParseDN(字符串区分名称)
{
列表组件=新列表();
IntPtr pDistinguishedName=Marshal.StringToHGlobalUni(区分名称);
尝试
{
IntPtr pDN=pDistinguishedName,pKey,pVal;
int cDN=区分名称.长度,cKey,cVal;
做
{
int lastError=DSGETRNW(参考pDN、参考cDN、输出pKey、输出cKey、输出pVal、输出cVal);
如果(lastError==错误\u成功)
{
字符串键,值;
if(cKey<0)
{
key=null;
}
else如果(cKey==0)
{
key=string.Empty;
}
其他的
{
key=Marshal.PtrToStringUni(pKey,cKey);
}
if(cVal<0)
{
值=空;
}
否则如果(cVal==0)
{
value=string.Empty;
}
其他的
{
值=Marshal.PtrToStringUni(pVal,cVal);
}
添加(新的KeyValuePair(key,value));
pDN=(IntPtr)(pDN.ToInt64()+unicodeincode.CharSize);//跳过逗号
cDN--;
}
其他的
{
抛出新的Win32Exception(lastError);
}
}cDN>0;
返回组件;
}
最后
{
FreeHGlobal元帅(pDistinguishedName);
}
}
[DllImport(“ntdsapi.dll”,CharSet=CharSet.Unicode)]
受保护的静态外部int DSQUOTERDNVALUE(
int cunQuotedDNValueLength,
字符串psUnquotedRdnValue,
ref int pcQuotedRdnValueLength,
IntPtr psQuotedRdnValue
);
公共静态字符串QuoteRDN(字符串rdn)
{
if(rdn==null)返回null;
int initialLength=rdn.Length;
int quotedLength=0;
IntPtr pQuotedRDN=IntPtr.0;
int lastError=DsQuoteRdnValueW(初始长度、rdn、ref quotedLength、PQQUOTEDRDN);
开关(最后一个错误)
{
案例错误\u成功:
{
返回字符串。空;
}
案例错误\缓冲区\溢出:
{
break;//继续
}
违约:
{
抛出新的Win32Exception(lastErr
var MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
var chunksAsKvps = MyString
    .Split(',')
    .Select(chunk => 
        { 
            var bits = chunk.Split('='); 
            return new KeyValuePair<string,string>(bits[0], bits[1]);
        });

var allOUs = chunksAsKvps
    .Where(kvp => kvp.Key.Equals("OU", StringComparison.OrdinalIgnoreCase));
var parsedDn = Win32LDAP.ParseDN(str);    
var allOUs2 = parsedDn
    .Where(dn => dn.Key.Equals("OU", StringComparison.OrdinalIgnoreCase));
// I don't remember where I got this from, honestly...I *think* it came
// from another SO user long ago, but those details I've lost to history...
public class Win32LDAP
{
   #region Constants
   public const int ERROR_SUCCESS = 0;
   public const int ERROR_BUFFER_OVERFLOW = 111;
   #endregion Constants

   #region DN Parsing
   [DllImport("ntdsapi.dll", CharSet = CharSet.Unicode)]
   protected static extern int DsGetRdnW(
       ref IntPtr ppDN, 
       ref int pcDN, 
       out IntPtr ppKey, 
       out int pcKey, 
       out IntPtr ppVal, 
       out int pcVal
   );

   public static KeyValuePair<string, string> GetName(string distinguishedName)
   {
       IntPtr pDistinguishedName = Marshal.StringToHGlobalUni(distinguishedName);
       try
       {
           IntPtr pDN = pDistinguishedName, pKey, pVal;
           int cDN = distinguishedName.Length, cKey, cVal;

           int lastError = DsGetRdnW(ref pDN, ref cDN, out pKey, out cKey, out pVal, out cVal);

           if(lastError == ERROR_SUCCESS)
           {
               string key, value;

               if(cKey < 1)
               {
                   key = string.Empty;
               }
               else
               {
                   key = Marshal.PtrToStringUni(pKey, cKey);
               }

               if(cVal < 1)
               {
                   value = string.Empty;
               }
               else
               {
                   value = Marshal.PtrToStringUni(pVal, cVal);
               }

               return new KeyValuePair<string, string>(key, value);
           }
           else
           {
               throw new Win32Exception(lastError);
           }
       }
       finally
       {
           Marshal.FreeHGlobal(pDistinguishedName);
       }
   }

   public static IEnumerable<KeyValuePair<string, string>> ParseDN(string distinguishedName)
   {
       List<KeyValuePair<string, string>> components = new List<KeyValuePair<string, string>>();
       IntPtr pDistinguishedName = Marshal.StringToHGlobalUni(distinguishedName);
       try
       {
           IntPtr pDN = pDistinguishedName, pKey, pVal;
           int cDN = distinguishedName.Length, cKey, cVal;

           do
           {
               int lastError = DsGetRdnW(ref pDN, ref cDN, out pKey, out cKey, out pVal, out cVal);

               if(lastError == ERROR_SUCCESS)
               {
                   string key, value;

                   if(cKey < 0)
                   {
                       key = null;
                   }
                   else if(cKey == 0)
                   {
                       key = string.Empty;
                   }
                   else
                   {
                       key = Marshal.PtrToStringUni(pKey, cKey);
                   }

                   if(cVal < 0)
                   {
                       value = null;
                   }
                   else if(cVal == 0)
                   {
                       value = string.Empty;
                   }
                   else
                   {
                       value = Marshal.PtrToStringUni(pVal, cVal);
                   }

                   components.Add(new KeyValuePair<string, string>(key, value));

                   pDN = (IntPtr)(pDN.ToInt64() + UnicodeEncoding.CharSize); //skip over comma
                   cDN--;
               }
               else
               {
                   throw new Win32Exception(lastError);
               }
           } while(cDN > 0);

           return components;
       }
       finally
       {
           Marshal.FreeHGlobal(pDistinguishedName);
       }
   }

   [DllImport("ntdsapi.dll", CharSet = CharSet.Unicode)]
   protected static extern int DsQuoteRdnValueW(
       int cUnquotedRdnValueLength,
       string psUnquotedRdnValue,
       ref int pcQuotedRdnValueLength,
       IntPtr psQuotedRdnValue
   );

   public static string QuoteRDN(string rdn)
   {
       if (rdn == null) return null;

       int initialLength = rdn.Length;
       int quotedLength = 0;
       IntPtr pQuotedRDN = IntPtr.Zero;

       int lastError = DsQuoteRdnValueW(initialLength, rdn, ref quotedLength, pQuotedRDN);

       switch (lastError)
       {
           case ERROR_SUCCESS:
               {
                   return string.Empty;
               }
           case ERROR_BUFFER_OVERFLOW:
               {
                   break; //continue
               }
           default:
               {
                   throw new Win32Exception(lastError);
               }
       }

       pQuotedRDN = Marshal.AllocHGlobal(quotedLength * UnicodeEncoding.CharSize);

       try
       {
           lastError = DsQuoteRdnValueW(initialLength, rdn, ref quotedLength, pQuotedRDN);

           switch(lastError)
           {
               case ERROR_SUCCESS:
                   {
                       return Marshal.PtrToStringUni(pQuotedRDN, quotedLength);
                   }
               default:
                   {
                       throw new Win32Exception(lastError);
                   }
           }
       }
       finally
       {
           if(pQuotedRDN != IntPtr.Zero)
           {
               Marshal.FreeHGlobal(pQuotedRDN);
           }
       }
   }


   [DllImport("ntdsapi.dll", CharSet = CharSet.Unicode)]
   protected static extern int DsUnquoteRdnValueW(
       int cQuotedRdnValueLength,
       string psQuotedRdnValue,
       ref int pcUnquotedRdnValueLength,
       IntPtr psUnquotedRdnValue
   );

   public static string UnquoteRDN(string rdn)
   {
       if (rdn == null) return null;

       int initialLength = rdn.Length;
       int unquotedLength = 0;
       IntPtr pUnquotedRDN = IntPtr.Zero;

       int lastError = DsUnquoteRdnValueW(initialLength, rdn, ref unquotedLength, pUnquotedRDN);

       switch (lastError)
       {
           case ERROR_SUCCESS:
               {
                   return string.Empty;
               }
           case ERROR_BUFFER_OVERFLOW:
               {
                   break; //continue
               }
           default:
               {
                   throw new Win32Exception(lastError);
               }
       }

       pUnquotedRDN = Marshal.AllocHGlobal(unquotedLength * UnicodeEncoding.CharSize);

       try
       {
           lastError = DsUnquoteRdnValueW(initialLength, rdn, ref unquotedLength, pUnquotedRDN);

           switch(lastError)
           {
               case ERROR_SUCCESS:
                   {
                       return Marshal.PtrToStringUni(pUnquotedRDN, unquotedLength);
                   }
               default:
                   {
                       throw new Win32Exception(lastError);
                   }
           }
       }
       finally
       {
           if(pUnquotedRDN != IntPtr.Zero)
           {
               Marshal.FreeHGlobal(pUnquotedRDN);
           }
       }
   }
   #endregion DN Parsing
}

public class DNComponent
{
   public string Type { get; protected set; }
   public string EscapedValue { get; protected set; }
   public string UnescapedValue { get; protected set; }
   public string WholeComponent { get; protected set; }

   public DNComponent(string component, bool isEscaped)
   {
       string[] tokens = component.Split(new char[] { '=' }, 2);
       setup(tokens[0], tokens[1], isEscaped);
   }

   public DNComponent(string key, string value, bool isEscaped)
   {
       setup(key, value, isEscaped);
   }

   private void setup(string key, string value, bool isEscaped)
   {
       Type = key;

       if(isEscaped)
       {
           EscapedValue = value;
           UnescapedValue = Win32LDAP.UnquoteRDN(value);
       }
       else
       {
           EscapedValue = Win32LDAP.QuoteRDN(value);
           UnescapedValue = value;
       }

       WholeComponent = Type + "=" + EscapedValue;
   }

   public override bool Equals(object obj)
   {
       if (obj is DNComponent)
       {
           DNComponent dnObj = (DNComponent)obj;
           return dnObj.WholeComponent.Equals(this.WholeComponent, StringComparison.CurrentCultureIgnoreCase);
       }
       return base.Equals(obj);
   }

   public override int GetHashCode()
   {
       return WholeComponent.GetHashCode();
   }
}

public class DistinguishedName
{
   public DNComponent[] Components
   {
       get
       {
           return components.ToArray();
       }
   }

   private List<DNComponent> components;
   private string cachedDN;

   public DistinguishedName(string distinguishedName)
   {
       cachedDN = distinguishedName;
       components = new List<DNComponent>();
       foreach (KeyValuePair<string, string> kvp in Win32LDAP.ParseDN(distinguishedName))
       {
           components.Add(new DNComponent(kvp.Key, kvp.Value, true));
       }
   }

   public DistinguishedName(IEnumerable<DNComponent> dnComponents)
   {
       components = new List<DNComponent>(dnComponents);
       cachedDN = GetWholePath(",");
   }

   public bool Contains(DNComponent dnComponent)
   {
       return components.Contains(dnComponent);
   }

   public string GetDNSDomainName()
   {
       List<string> dcs = new List<string>();
       foreach (DNComponent dnc in components)
       {
           if(dnc.Type.Equals("DC", StringComparison.CurrentCultureIgnoreCase))
           {
               dcs.Add(dnc.UnescapedValue);
           }
       }
       return string.Join(".", dcs.ToArray());
   }

   public string GetDomainDN()
   {
       List<string> dcs = new List<string>();
       foreach (DNComponent dnc in components)
       {
           if(dnc.Type.Equals("DC", StringComparison.CurrentCultureIgnoreCase))
           {
               dcs.Add(dnc.WholeComponent);
           }
       }
       return string.Join(",", dcs.ToArray());
   }

   public string GetWholePath()
   {
       return GetWholePath(",");
   }

   public string GetWholePath(string separator)
   {
       List<string> parts = new List<string>();
       foreach (DNComponent component in components)
       {
           parts.Add(component.WholeComponent);
       }
       return string.Join(separator, parts.ToArray());
   }

   public DistinguishedName GetParent()
   {
       if(components.Count == 1)
       {
           return null;
       }
       List<DNComponent> tempList = new List<DNComponent>(components);
       tempList.RemoveAt(0);
       return new DistinguishedName(tempList);
   }

   public override bool Equals(object obj)
   {
       if(obj is DistinguishedName)
       {
           DistinguishedName objDN = (DistinguishedName)obj;
           if (this.Components.Length == objDN.Components.Length)
           {
               for (int i = 0; i < this.Components.Length; i++)
               {
                   if (!this.Components[i].Equals(objDN.Components[i]))
                   {
                       return false;
                   }
               }
               return true;
           }
           return false;
       }
       return base.Equals(obj);
   }

   public override int GetHashCode()
   {
       return cachedDN.GetHashCode();
   }
}
var MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
var split = MyString.Split(new string[] { "OU=", "," }, StringSplitOptions.RemoveEmptyEntries);
var lstSplit = MyString.Split(new[] { ',' })
        .Where(splitItem => splitItem.StartsWith(
               "OU=", StringComparison.OrdinalIgnoreCase)).ToList();
public static int CountSubstring(this string text, string value)
{                  
    int count = 0, minIndex = text.IndexOf(value, 0);
    while (minIndex != -1)
    {
        minIndex = text.IndexOf(value, minIndex + value.Length);
        count++;
    }
    return count;
}
MyString = "OU=Level3,OU=Level2,OU=Level1,DC=domain,DC=com";
int count = MyString.CountSubstring("OU=");
public static int CountOccurences(string needle, string haystack)
{
    return (haystack.Length - haystack.Replace(needle, "").Length) / needle.Length;
}