如何将 List<object> 转换为 List<T>?

6
我很努力地想要解决以下问题:
我有一个对象列表,对象类型为整数:
int a = 1;
  int b = 2;
  int c = 3;
  List<object> kk = new List<object>( );
  kk.Add( ( object )a );
  kk.Add( ( object )b );
  kk.Add( ( object )c );

我希望你能将 List<object> 转换为 List<objecttype>,在上面的示例中,objecttype 是 int。我想将 List<object> 转换为 List<int>。有没有一种方法来解决这个问题?
我正在寻找通用解决方案,并假设没有类型转换的知识。 enter image description here

1
List<int> l = kk.Select(k=> (int)k).ToList(); - Fendy
我也希望你意识到,我相信这将会产生装箱/拆箱的惩罚。 - Aron
如果对象列表中包含字符串,则此强制转换将无法正常工作,我应该尝试将其强制转换为字符串、整数、布尔值和双精度浮点数,并返回成功完成强制转换的列表。 - User1551892
这在问题中并不明显,展示所有整数的示例数据是一个非常糟糕的选择,无法得出适当的答案来解决那个问题。考虑更新问题和示例输入/输出以反映真正的目标。但是,请记住,List<int> 是一个编译时类型,因此不能List<object>中的运行时值推断出或依赖于它 - 直到稍后才能访问该信息,而此时为时已晚。 - user2246674
1
随着标题的更改,请查找TypeConverter。它可以用于在两个任意类型之间进行转换,前提是已知/可能存在这样的转换..请注意,T仍然不来自List<object>中对象的类型。这是一个类似的问题,只能基于List<object>知道T->int,就像知道List<object>->List<int>一样。这些值直到运行时才能使用。 - user2246674
显示剩余3条评论
5个回答

20

使用 LINQ 有两种方法

如果对象中有任何一个不是 int,此版本将抛出异常。

var ints = kk.Cast<int>().ToList();

这个版本将只保留那些可以转换为int的部分。

var ints = kk.OfType<int>().ToList();

注意:这些方法仅处理直接转换,两种方法都不支持隐式/显式转换。(有时这可能会导致混乱的行为。有一些很好的SO帖子可以解释这个问题。) - user2246674

6
也许您可以尝试以下做法:
List<object> objects = new List<object>();
List<int> ints = objects.Select(s => (int)s).ToList();

应该适用于所有类型。

一般来说:

List<object> objects = new List<object>();
List<objecttype> castedList = objects.Select(s => (objecttype)s).ToList();

现实世界的例子:grdDetailList.GetRows().Where(x => (int) x.Cells["TreasuryDetailLedgerID"].Value == treasuryID).ToList() - Hamid

1

试试这个:

var newList = kk.Cast<int>().ToList();

1
   var typeofkk = kk.ToArray( ).Select( x => x.GetType( ) ).ToArray( ).FirstOrDefault( );
   Array ll = Array.CreateInstance( typeofkk, kk.Count );
   Array.Copy( kk.ToArray (), ll, kk.Count );

也许这不是我寻找的解决方案,但它以某种方式解决了我的问题。

0

尝试在您的列表 kk 上使用 .Cast<int>()


你刚刚在一个C#的问题中使用了VB.Net的语法 ;) - Aron
我已经陷入了自主模式... :'(不过你的回答更好 ;) - Ash Clarke

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