2015-09-02 21 views
2

我有一個這樣的實體:在列表使用的string.join多個項目

public class Task 
{ 
    public string TaskID { get; set; } 
    public string Description { get; set; } 
    public string IsComplete { get; set; } 
} 

我有這樣的任務集合:

List<Task> tasks = new List<Task>(); 
tasks.Add(new Task() { TaskID = "1", Description = "A", IsComplete = "Yes" }); 
tasks.Add(new Task() { TaskID = "2", Description = "B", IsComplete = "No" }); 

我試圖得到如下界定string從這個集合:

1#Yes,2#No

我已經成功得到儘可能:

string delimitedString = String.Join(",", tasks.ToList().Select(l => l.TaskID)); 

...我如何進一步選擇和分離額外的領域?

回答

12

像這樣:

string delimitedString = 
      string.Join(",", tasks.Select(
            l => string.Format("{0}#{1}", l.TaskID, l.IsComplete))); 

如果您正在使用C#-6:

string delimitedString = 
      string.Join(",", tasks.Select(
            l => $"{l.TaskID}#{l.IsComplete}")); 
+0

謝謝,效果很好。你遺漏了一個右括號btw – user982119

+0

@ user982119修正:) –

5

你可以做到這一點Yuval Itzchakov proposed,但我寧願在Task實現一個新的方法你可以打電話 - 只是爲了讓閱讀更容易。

public class Task 
{ 
    ... 
    public String ToDelimitedString() 
    { 
     return String.Format("{0}#{1}", TaskId, IsComplete); 
    } 
} 

然後調用它像這樣:

var delimString = String.Join(",", tasks.Select(t => t.ToDelimitedString())); 

這樣,你在一個地方你的格式,可以從任何地方調用它沒有矛盾。順便說一下:我還會嘗試爲該課程找一個不同的名稱,以避免與System.Threading.Tasks.Task混淆。

2

我想你需要的是爲任務實現ToString,所以它顯示你想要的。

如果你不能(它不是你的代碼),實現一個獨立的功能:

private string StringifyTask(Task task) 
{ 
    return string.Format("{0}#{1}", task.TaskId, task.IsComplete); 
} 

然後用StringifyTask作爲選擇的參數。另外 - 請注意,您在Linq語句之前並不需要ToList。