2017-02-10 61 views
0

如何將多個拆分值從字符串列表轉換爲對象,如果沒有字符串需要拆分則刪除如何從字符串列表中創建多個拆分值到對象,如果沒有字符串需要拆分

我想

拆分此

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在第一次運行中的值是可以的,但在第二次運行中會爆炸,因爲我沒有任何東西需要分割。

如何防止沒有字符串分裂的情況。

在此先感謝

Jolynice

+0

檢查你的字符串是否包含在你開始之前? – BugFinder

回答

1

您可以檢查str是空的或剛空格

if(!string.IsNullOrWhiteSpace(str)) 
+1

您好Tugberk,我也很感謝您的解決方案,但我會使用Levent解決方案。 – jolynice

2
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(); 
+0

謝謝Levent,工作正常。非常感謝你 – jolynice

0

我只想指出的是,你可以使用2相結合Linq功能如下:

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<string>其中每個string旨意樣子"<name> #<long_value>"

Select - 將回你表達的內部處理對象,在我的示例中,基本上是修剪了字符串兩端的所有空白,然後將其分割爲#字符,然後將其打包到CrossReference對象中。

SelectSelectMany中調用操作只是爲了在一次運行中處理結果而不是在兩次運行(分離然後處理)中運行結果。

由於StringSplitOptions.RemoveEmptyEntries參數傳遞給Split方法,因此在開始時不需要檢查字符串是否爲空。