0

我有这样的字符串值:

string strRole = "ab=Admin,ca=system,ou=application,role=branduk|ab=Manager,ca=system,ou=application,role=brankdusa|ab=sale,ca=system,ou=application,role=brandAu";

我只需要将角色检索到字符串数组。我想知道是否有在 C# 4.0 中拆分字符串的最佳方法

string[] arrStrRole = strRole.Split('|').Select .. ??

基本上,我需要brandUK、brandUsa、brandAu到string[] arrStrRole。谢谢。

4

6 回答 6

0

您可以使用string[] arrStrRole = strRole.Split('|',','); ,这将根据 | 和 , 字符

于 2012-10-08T08:57:22.353 回答
0

您可以使用这样的扩展程序,这样您就可以轻松地对其进行测试。

 public static string[] ParseRolesIntoList(this string csvGiven)
            {
                var list = new List<string>();
                if (csvGiven == null) return null;
                var csv = csvGiven.Split(',');
                foreach (var s in csv)
                {
                    if (string.IsNullOrEmpty(s)) continue;
                    if(!s.StartsWith("role")) continue;
                    var upperBound =  s.IndexOf("|");
                    if (upperBound <= 0) upperBound = s.Length;
                    var role = s.Substring(s.IndexOf("=") + 1, 
                                        upperBound - s.IndexOf("=") - 1);
                    list.Add(role);
                }
                return list.ToArray();
            }

下面的测试在您的示例中发现了 brankdusa 拼写错误。其他一些答案不会处理brandAu,因为它的匹配略有不同。如果您愿意,请尝试对他们进行此测试

  [Test]
    public void Should_parse_into_roles()
    {
        //GIVEN 
        const string strRole = "ab=Admin,ca=system,ou=application,role=branduk|ab=Manager,ca=system,ou=application,role=brankdusa|ab=sale,ca=system,ou=application,role=brandAu";

        //WHEN
        var roles = strRole.ParseRolesIntoList();

        //THEN
        Assert.That(roles.Length, Is.EqualTo(3));
        Assert.That(roles[0], Is.EqualTo("branduk"));
        Assert.That(roles[1], Is.EqualTo("brankdusa"));
        Assert.That(roles[2], Is.EqualTo("brandAu"));
    }
于 2012-10-08T08:59:57.720 回答
0
string[] arrStrRole = strRole.Split('|').Select(r => r.Split(new []{"role="}, StringSplitOptions.None)[1]).ToArray()

产生一个包含三个字符串的字符串数组:

布兰杜克布
兰杜萨品牌
Au

于 2012-10-08T09:00:04.520 回答
0

您可以String.Split在此LINQ查询中使用:

var roles = from token in strRole.Split('|')
            from part in token.Split(',')
            where part.Split('=')[0] == "role"
            select part.Split('=')[1];

请注意,这仍然容易出错,并且要求数据始终具有这种格式。我提到它是因为您已经开始使用Split('|').Select.... 您还可以使用嵌套循环。

如果你需要它,String[]你只需要打电话ToArray

String[] result = roles.ToArray();
于 2012-10-08T09:00:34.367 回答
0

我会选择Regex而不是拆分字符串。结合您的预期Select解决方案,它可能如下所示:

var roles = Regex.Matches(strRole, @"role=(\w+)")
                 .Cast<Match>()
                 .Select(x => x.Groups[1].Value).ToArray();
于 2012-10-08T09:05:23.380 回答
0

这给出了 3 个值的数组。

void Main()
{
  string strRole = "ab=Admin,ca=system,ou=application,role=branduk|ab=Manager,ca=system,ou=application,role=brankdusa|ab=sale,ca=system,ou=application,role=brandAu";

  var arrStrRole = strRole.Split('|',',')
                     .Where(a => a.Split('=')[0] == "role")
                     .Select(b => b.Split('=')[1]);

  arrStrRole.Dump();
}
于 2012-10-08T09:34:03.597 回答