将String.Join用于列表

时间:2015-09-02 12:22:55

标签: c# string linq

我有一个这样的实体:

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));

...如何进一步选择和分隔其他字段?

3 个答案:

答案 0 :(得分: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}"));

答案 1 :(得分: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 :(得分:2)

我认为您需要为任务实现ToString,因此它会显示您想要的内容。

如果你不能(它不是你的代码),实现一个单独的功能:

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

然后使用StringifyTask作为Select的参数。另外 - 请注意,在Linq语句之前,您实际上并不需要ToList。