2015-09-02 3 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 в качестве аргумента Select. Также - обратите внимание, что вам не нужен ToList перед оператором Linq.

Смежные вопросы