将IEnumerable <t>转换为string [] </t>

时间:2011-09-27 05:57:10

标签: c# linq linq-to-entities

我有一个名为Product

的实体
class Product
{
     public Id { get; set; }
     public Name { get; set; }
}

我有一份所有产品清单:

IEnumerable<Product> products = _productRepository.GetAll()

我想从这个产品列表中获取一个字符串数组,这个数组将包含产品Id +产品名称,所以当我尝试使用以下代码进行投射时:

string[] s = products.Cast<string>().ToArray();

我得到以下例外:

Unable to cast object of type 'Product' to type 'System.String'

异常确实会产生很多异常,所以如果我有一个方法

string ProductToString(Product p)
{
    return p.Name;
}

或对产品对象的ToString()重写,以便我如何使用此方法从IEnumerable获取string []列表?

4 个答案:

答案 0 :(得分:24)

嗯,考虑到这种方法,您可以使用 1

string[] s = products.Select<string>(ProductToString).ToArray();

然而,通常使用lambda表达式来执行而不使用单独的方法会更加惯用:

// Matches ProductToString, but not your description
string[] s = products.Select(p => p.Name).ToArray();

如果要从各个地方调用(确保一致性)或者做了大量工作,我只会使用单独的方法。

编辑:我刚刚注意到你的 description (想要ID +名称)实际上并不匹配你给出的ProductToString方法(只是给出了名字)。对于我使用的ID +名称:

string[] s = products.Select(p => p.ID + " " + p.Name).ToArray();

string[] s = products.Select(p => string.Format("{0} {1}", p.ID, p.Name))
                     .ToArray();

或者您当然可以更改ProductToString方法。

或者,您可以覆盖ToString()中的Product,如果通常是,您希望如何将Product转换为string。然后,您可以使用方法组转换或lambda表达式来调用ToString


1 您可能不需要明确指定类型参数 - 即:

string[] s = products.Select(ProductToString).ToArray();

将正常工作 - 类型推断和方法组转换的规则总是让我困惑,编译器行为随着时间的推移略有变化。刚刚进行的快速测试看起来 可以正常工作,但稍微不同情况下可能存在细微之处。

答案 1 :(得分:2)

string[] s = products.Select(p => p.Name).ToArray();

或者,如果您需要Id +名称:

string[] s = products.Select(p => p.Id + ' ' + p.Name).ToArray();

答案 2 :(得分:1)

使用

string[] s = (from p in products select p.Id.ToString() + " " + p.Name.ToString()).ToArray();

答案 3 :(得分:-1)

这对我有用:

String.Join(";", mi_customer.Select(a => a.Id).Cast<string>().ToArray());

mi_customer必须是您的对象,在我的情况下是表。