Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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,我想知道是否有可能读取一个长度为n的字符串,从x字符到y字符,而不必将其拆分成更小的片段 我有以下字符串,用于ADCN=someName、OU=someGroup、OU=groups、DC=some、DC=domain、DC=com中的路径,我希望能够只读取其中的someName部分,而不必先按=/code>或,进行拆分。我如何做到这一点 原因是,我现在不必进行分组比较: SearchResult t1 = search.FindOne(); foreach (string s in t1.Pr

我想知道是否有可能读取一个长度为n的字符串,从x字符到y字符,而不必将其拆分成更小的片段

我有以下字符串,用于AD
CN=someName、OU=someGroup、OU=groups、DC=some、DC=domain、DC=com
中的路径,我希望能够只读取其中的
someName
部分,而不必先按
=/code>或
进行拆分。我如何做到这一点

原因是,我现在不必进行分组比较:

SearchResult t1 = search.FindOne();
foreach (string s in t1.Properties["memberof"])
{
    foreach (string g in groups)
    {
        if (s.ToLower().Contains(g.ToLower()))
        {
            // do something
        }
    }
}

我宁愿将if子句设置为等于,但我不希望总是将上述路径/组拆分为两个数组。如何操作?

使用带有
IndexOf
Substring
的简单字符串操作:

string s = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";

const string prefix = "CN=";
int start = s.IndexOf(prefix);
if (start >= 0)
{
    string value = s.Substring(start + prefix.Length, s.IndexOf(',', start) - prefix.Length);
    Console.WriteLine(value);
}
请注意,如果
CN=
条目是行中的最后一个条目(因为它不是以逗号结尾),则此简单示例将失败。不过,您可以通过查看第二个
IndexOf
调用的返回值来检查这一点


但是在这种情况下,
CN=
通常是第一件事。

使用带有
索引of
子字符串的简单字符串操作:

string s = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";

const string prefix = "CN=";
int start = s.IndexOf(prefix);
if (start >= 0)
{
    string value = s.Substring(start + prefix.Length, s.IndexOf(',', start) - prefix.Length);
    Console.WriteLine(value);
}
请注意,如果
CN=
条目是行中的最后一个条目(因为它不是以逗号结尾),则此简单示例将失败。不过,您可以通过查看第二个
IndexOf
调用的返回值来检查这一点


但是在这种情况下,
CN=
通常是第一件事。

使用
Split
可以检查给定键中的任何是否等于搜索值

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";
var prefix = "CN";
var searchValue = "someName";
var contains = val.Split(',').Any(value => value.Split('=')[0] == prefix && value.Split('=')[1] == searchValue);
除了检查该值是否等于搜索值外,您还可以返回该值

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";
var prefix = "CN";
var foundValue = val.Split(',').FirstOrDefault(value => value.Split('=')[0] == prefix)?.Split('=')[1];

尽管你说你不想使用它,但我仍然使用了
Split
,因为我认为它是一个很好的单行程序。

使用
Split
可以检查给定键中的任何是否等于搜索值

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";
var prefix = "CN";
var searchValue = "someName";
var contains = val.Split(',').Any(value => value.Split('=')[0] == prefix && value.Split('=')[1] == searchValue);
除了检查该值是否等于搜索值外,您还可以返回该值

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";
var prefix = "CN";
var foundValue = val.Split(',').FirstOrDefault(value => value.Split('=')[0] == prefix)?.Split('=')[1];

尽管你说你不想使用它,我还是使用了
Split
,因为我认为它是一个很好的单行程序。

你可以使用
String.IndexOf
找到正确的偏移量,然后使用
String.SubString
读取你想要的部分

const string input = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";
const string start = "CN=";
const string stop = ",";

int startIndex = input.IndexOf(start, 0);
int stopIndex = input.IndexOf(stop, startIndex);

var extracted = input.Substring(startIndex + start.Length, stopIndex - startIndex - start.Length);

Console.WriteLine(extracted);


PS:也许还可以看看你的特殊用例

您可以使用
String.IndexOf
查找正确的偏移量,然后使用
String.SubString
读取所需的零件

const string input = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com";
const string start = "CN=";
const string stop = ",";

int startIndex = input.IndexOf(start, 0);
int stopIndex = input.IndexOf(stop, startIndex);

var extracted = input.Substring(startIndex + start.Length, stopIndex - startIndex - start.Length);

Console.WriteLine(extracted);


PS:也许还可以看看你的特殊用例

如果要进行组比较,我将使用System.DirectoryServices.AccountManagement命名空间

PrincipalContext Context = new PrincipalContext(ContextType.Domain, "");
UserPrincipal Usr = UserPrincipal.FindByIdentity(Context, "User");
GroupPrincipal G = GroupPrincipal.FindByIdentity(Context, "Group");

if(Usr.IsMemberOf(G)) {

}

如果要进行组比较,我将使用System.DirectoryServices.AccountManagement命名空间

PrincipalContext Context = new PrincipalContext(ContextType.Domain, "");
UserPrincipal Usr = UserPrincipal.FindByIdentity(Context, "User");
GroupPrincipal G = GroupPrincipal.FindByIdentity(Context, "Group");

if(Usr.IsMemberOf(G)) {

}

“我不必做群组比较”我不明白,什么是
群组
?@TimSchmelter我比较的是,如果某个用户在某个群组中,为了检查权限,
群组
是一组有效的群组。另外,正如我所说,如果可能的话,我希望避免使用数组,而且我对编程比较陌生,所以我不知道所有语法,例如LINQ等等。“我不必做组比较”我不明白,什么是
?@TimSchmelter我正在比较某个用户是否在某个组中,以检查权限,
是有效的组数组。另外,正如我所说的,如果可能的话,我希望避免使用数组,而且我对编程比较陌生,所以我不知道所有语法,例如LINQ等。我只想看看
“CN=“
前缀,因为这是组名的来源,但是谢谢you@EInherjar我更改了它查找
CN=
前缀的代码。还是我误解了你?@EInherjar,这个解决方案在cn位于字符串中的任何位置都有效。对不起,你所说的键是OU、DC之类的,或者是介于
cn=
之间的任何东西,
?@EInherjar我是指
OU
DC
cn
。搜索值是
=
或字符串结尾之间应该匹配的值。我只想看看
“CN=“
前缀,因为这是组名的来源,但是谢谢you@EInherjar我更改了它查找
CN=
前缀的代码。还是我误解了你?@EInherjar,这个解决方案在cn位于字符串中的任何位置都有效。对不起,你所说的键是OU、DC之类的,或者是介于
cn=
之间的任何东西,
?@EInherjar我是指
OU
DC
cn
。搜索值是
=
或字符串结尾之间应该匹配的值。这可以工作,但如果允许的组数组中有组,而这些组在AD中还不存在,则会中断。有什么办法可以避免这种情况吗?这是可行的,但如果允许的组数组中存在组,而这些组在广告中还不存在,那么它就会中断。有什么办法可以避免这种情况吗?