无法隐式将类型“string”转换为“System.Collections.Generic.List<string>”

12

这个问题可能已经被回答了数百次,但还是问一遍。

我有这段代码:

private void PopulateStringDropdownList(List<ObjectInfo> listObject,
                                        object selectedType = null)
{
    List<string> listString = listObject.OrderBy(x => x.m_Type).ToString();
    for (int i = 0; i < listString .Count; i++)
    {
        for (int j = i + 1; j < listString .Count; j++)
        { 
            if (String.Equals(listString [i], listString [j]))
            {
                listString.RemoveAt(j);
            }
        }
    }
    ViewBag.property1 = new SelectList(listString );
}

基本上,我正在尝试从我传递的列表中每个对象包含的属性中获取字符串,并将其填充到下拉列表中。

但是代码无法编译,因为您在上面看到的错误,而我还没有完全理解为什么。有任何帮助吗?


1
哪一行出了问题?(请花点时间自己格式化代码以备将来提问。) - Jon Skeet
3
请使用ToList()方法替代ToString()。 - Hans Passant
1
@HervéSimard 错误在哪里? - Cédric Bignon
@CédricBignon 抱歉,我重新编写了我的代码,以确保它是正确的。 - hsim
7
各位,他只有11点声望,让我们在给他投反对票之前先让他适应一下SO吧 :P。 - P.Brian.Mackey
显示剩余7条评论
7个回答

17

这是有问题的那一行:

List<string> listString = listObject.OrderBy(x => x.m_Type).ToString();
< p > ToString 返回一个字符串,而您正在尝试将其分配给一个 List<string> 变量。

您需要执行类似以下操作:

List<string> listString = listObject.OrderBy(x => x.m_Type)
                                    .Select(x => x.ToString())
                                    .ToList();

这个语句将按照您想要的顺序对listObject可枚举对象进行排序,然后将值转换为字符串,并最终将可枚举对象转换为List<string>


5

看看这段代码:

List<string> listString = listObject.OrderBy(x => x.m_Type).ToString();

右侧表达式在 OrderBy 的结果上调用了 ToString()——这本身是没有用的,会导致返回一个 string
然后你试图将那个 string 表达式赋值给一个新的类型为 List<string> 的变量,这是行不通的。
猜测你只需要使用 ToList 而不是 ToString:
List<string> listString = listObject.OrderBy(x => x.m_Type).ToList();

不是我不想;而是它不起作用。起初我认为这是因为接收数据的列表是字符串列表,但是...不是这个原因。 - hsim
@HervéSimard:你是什么意思?当你尝试这个时,哪里失败了?m_Type字段的类型是什么?(请在以后更具体一些。) - Jon Skeet

2

我认为你需要使用ToList而不是ToString

此外,如果你只是想删除重复的元素,你可以简单地使用LINQ来做到这一点:

List<string> listString = listObject.OrderBy(x => x.m_Type).
    Select(x => x.ToString()).Distinct().ToList();

哦!那我也试试。 - hsim
listObject 是 ObjectInfo 对象的列表,而不是字符串,因此请使用 listObject.OrderBy(x => x.m_Type).Select(l => l.ToString()).Distinct().ToList()。 - AndyClaw
@AndyClaw 谢谢你,安迪。我想当你评论时我正在编辑我的答案。 - Matthew Strawbridge

2
您可以将所有的代码简化为以下内容:
List<string> listString = listObject.OrderBy(x => x.m_Type)
                                    .Select(x => x.ToString())
                                    .Distinct()  // Remove duplicated entries
                                    .ToList();
ViewBag.property1 = new SelectList(listString);

2

还需要进行一些更正。以下是完整的代码:

private void PopulateStringDropdownList(List<ObjectInfo> listObjects, object selectedType = null)

        {
            List<string> listString = listObjects.OrderBy(x => x.m_Type)
                                             .Select(x => x.m_Type.ToString())
                                             //.Distinct()
                                             .ToList();
            ViewBag.cardType = new SelectList(listString );
        }

那样找到的正确值是类型的字符串而不是对象的类型。
感谢大家的帮助!

2

int列表转换为string列表:

List<string> listString =  listObject.OrderBy(x => x.m_Type).
Select(x =>x.ToString()).ToList();

0
string tags = Convert.ToString(item.tagsNcategory.OrderBy(x => x.meta_value.Select(x => x.ToString()))); 
var tags_name = tags.Replace(",", " ");

1
请添加说明。 - Syscall

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