使用字符串.连接列表中的多个项目

本文关键字:项目 列表 字符串 连接 | 更新日期: 2023-09-27 18:10:47

我有一个这样的实体:

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

…如何进一步选择和分离其他字段?

使用字符串.连接列表中的多个项目

像这样:

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

你可以按照Yuval Itzchakov建议的方式来做,但我宁愿在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.

混淆。

我认为你需要的是为Task实现一个ToString,这样它就能显示你想要的东西。

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

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

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