C#对象列表转换为字符串列表

6

对象列表

我有一个看起来如上面那样的 List<object>,我想将它转换为 List<string>

我该如何进行转换?

我需要一个包含 6 个项目的 List<string>(11:00、13:45 等)。


1
你没有一个 List<object>,而是一个大小为6的 object[] - Scott Chamberlain
@ScottChamberlain,没错,但是下面的大多数解决方案仍应该能够工作。数组具有IEnumerable。 - gunr2171
seances是List<object>,而且seances的第一个索引是object[]。我需要这些项目。 - Melih Mucuk
如果里面有一个不是字符串的对象,你希望发生什么?它应该被排除在外,还是应该抛出异常,或者其他什么操作? - Servy
6个回答

20
var mylist = myObjectList.ConvertAll(x => x.ToString());

编辑

  var mylist = myObjectList.ConvertAll(x => Convert.ToString(x));

感谢 Scott Chamberlain

获取第一个对象数组

var mylist = (myObjectList.First() as object[]).ToList()
                .ConvertAll(x=>Convert.ToString(x));
将休息加入列表。
mylist.AddRange(mylist.GetRange(1,myObjectList.Count-2).ConvertAll(x=>Convert.ToString(x)));

2
哦,我从来不知道 ConvertAll。然而,你应该使用 Convert.ToString(x),因为它会检查类是否支持 IConvertable,如果不支持,则回退到 .ToString() - Scott Chamberlain

6
var stringList = yourObjectList.OfType<string>().ToList();

记得添加命名空间 System.Linq;

需要使用OfType将数组转换为 array<T>,以便在 LINQ 中使用。


你的条目中可能有一个数组吗? - TGH
@MelihMucuk,你的yourObjectList里有什么?应该是seanceInfo.theatre[i].seances[0] - gunr2171
请确保已添加 System.Linq 的 using 语句。 - TGH
System.Linq已添加。我正在使用.net 4.0。没有选项可供选择。我更新了我的问题,请查看。 - Melih Mucuk
1
好的,已更新。它只是一个对象数组 - 而不是 Linq 所需的 T 类型数组。 - TGH
显示剩余2条评论

3

试试这个

List<string> stringlist = objectList.Cast<string>()
                                    .ToList();

如果您不确定这些元素是字符串,您可以使用Select

List<string> stringlist = objectList.Select(x=> x.ToString())
                                    .ToList();

为避免空值引用异常,请尝试以下方法:

List<string> stringlist = objectList.Where(x=> x != null)
                                    .Select(x=> x.ToString())
                                    .ToList();

第二个会在null值上失败。 - Servy
@Servy 我预料到了,从你那里得到了。现在已经修复 :) - Sriram Sakthivel

2
使用LINQ很容易实现。如果你确定它们都是字符串,你可以简单地执行以下操作:
int i = //Some code that sets i, like a for loop
var oldList = seanceInfo.theatre[i].seances;
List<string> newList = oldList.Cast<string>().ToList();

如果您不确定所有的对象都是字符串,您需要进行某种类型的转换,然而这同样很容易。

List<string> newList = oldList.Select(o => Convert.ToString(o)).ToList();

从您的评论中:“seances是List<object>,而seances的第一个索引是object[]。我需要这些项。”,我认为您真正想要的可能是SelectMany
List<string> info = seanceInfo.theatre.SelectMany(x => x.seances).Select(x => Convert.ToString(x)).ToList();

这将把每个影院中的每个场次合并成一个主列表。

它能工作,但我需要在[0]索引中列出项目。你的解决方案没有给我这些项目。 - Melih Mucuk
@MelihMucuk 是的,它可以。请查看我的更新版本,我已经替换了 \\... - Scott Chamberlain
无法将类型为'System.Object[]'的对象强制转换为类型'System.String'。 - Melih Mucuk
@MelihMucuk 我们都已经意识到了这一点,每个回答都试图向您提供此信息。请更新您的答案,并使用我们各种实现的实际代码展示您尝试过的内容。您可能在从该网站复制到代码时出现了错误,如果我们能看到您编写的内容,将会有很大帮助。 - Scott Chamberlain

1
你可以使用 LinQ 简单地进行转换。
myObjectList.Cast<string>();

或者过滤掉所有非字符串。
myObjectList.OfType<string>();

没有这样的方法 TypeOf - Sriram Sakthivel
我会小心使用 OfType。它实际上像一个 where 语句,寻找给定类型的对象,并筛选掉不是该类型的对象。如果你的列表中有超过两种类型,或者你的类型一开始就不是字符串类型,那么它将选择更少的对象。 - gunr2171

-4

强制类型转换,例如:

var list = (List<String>) listObjects.

5
好的,我来翻译。 "Ok, I'm calling your bluff. That does not compile." 可以翻译为:"好的,我要揭穿你的虚张声势了。这个无法编译。" - gunr2171
通常在将代码作为答案发布之前,尝试运行它是一个好主意。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接