【问题标题】:How to do multiple split values from a list of string to an object, blows if there is no string to split如何从字符串列表到对象进行多个拆分值,如果没有要拆分的字符串会爆炸
【发布时间】:2017-02-10 11:19:14
【问题描述】:

如何从字符串列表到对象进行多个拆分值,如果没有要拆分的字符串会爆炸

我要拆分这个

List<string> CrossReference = new List<string>
    {
         "task #1443; task #1447; task #1444; task #973; rel #33; sprint #815",
         ""
    };

首先由

;

然后由

#

我有这门课

public class CrossReference
{
    public long Aid { get; set; }
    public string TaskType { get; set; }
}

我有这个测试

[TestMethod]
public void splitTest()
{
    List<string> CrossReference = new List<string>
    {
         "task #1443; task #1447; task #1444; task #973; rel #33; sprint #815",
         ""
    };

    foreach (var str in CrossReference)
    {
        var str1 = str.Trim().Split(';')
                    .Select(x => new CrossReference
                    {
                        TaskType = (string)x.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[0],
                        Aid = Convert.ToInt64(x.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1]),
                    }).ToList();
    }
}               

第一次运行时 str1 的值还可以,但第二次运行时因为我没有要拆分的东西而爆炸。

如何防止没有字符串可拆分的情况。

提前致谢

乔莉妮丝

【问题讨论】:

  • 在开始之前检查您的字符串是否包含两者?

标签: c# string linq list split


【解决方案1】:
you can skip empty rows..

 var str1 = str.Trim().Split(';')
                .Where(x => !string.IsNullOrEmpty(x) && x.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries).Any())
                .Select(x => new CrossReference
                {
                    TaskType = (string)x.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[0],
                    Aid = Convert.ToInt64(x.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1]),
                }).ToList();

【讨论】:

  • 感谢 Levent,工作正常。非常感谢
【解决方案2】:

您可以检查 str 是否为空或只有空格

 if(!string.IsNullOrWhiteSpace(str))

【讨论】:

  • 您好 Tugberk,我也很欣赏您的解决方案,但我会使用 Levent 解决方案。
【解决方案3】:

我只想指出,您可以为此使用 2 个组合的 Linqfunctions:

CrossReference
    .SelectMany(str => 
        str.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(kv => { 
                string[] pair = kv.Trim().Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);
                return new CrossReference { TaskType = pair[0].Trim(), Aid = long.Parse(pair[1].Trim()); 
            }
        )
    );

(解释)

SelectMany - 将所有拆分的字符串组合成一个IEnumerable&lt;string&gt;,其中每个strings 看起来像"&lt;name&gt; #&lt;long_value&gt;"

Select - 然后将返回您在表达式内部处理的对象,在我的示例中,该对象基本上是修剪字符串两端的所有空格,然后将其拆分为 # 字符,然后将其打包CrossReference 对象。

Select 操作在 SelectMany 内部被调用,只是为了处理一次运行的结果,而不是两次运行(拆分然后处理)。

由于StringSplitOptions.RemoveEmptyEntries参数传入Split方法,所以不需要在开始时进行trim,也不需要检查字符串是否为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2017-11-03
    • 2011-09-04
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多