Mah*_*mal 9 c# linq linq-to-entities
我有一个名为Product的实体
class Product
{
public Id { get; set; }
public Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个所有产品的清单:
IEnumerable<Product> products = _productRepository.GetAll()
Run Code Online (Sandbox Code Playgroud)
我想从这个产品列表中获取一个字符串数组,这个数组将包含产品Id +产品名称,所以当我尝试使用以下代码强制转换它时:
string[] s = products.Cast<string>().ToArray();
Run Code Online (Sandbox Code Playgroud)
我得到以下例外:
Unable to cast object of type 'Product' to type 'System.String'
Run Code Online (Sandbox Code Playgroud)
这种例外真的会让人觉得很多,所以如果我有一个方法
string ProductToString(Product p)
{
return p.Name;
}
Run Code Online (Sandbox Code Playgroud)
或者对产品对象的ToString()重写,以便我如何使用此方法从IEnumerable获取string []列表?
Jon*_*eet 25
那么,鉴于这种方法你可以使用1:
string[] s = products.Select<string>(ProductToString).ToArray();
Run Code Online (Sandbox Code Playgroud)
但是,如果没有单独的方法,通常使用lambda表达式来执行此操作会更加惯用:
// Matches ProductToString, but not your description
string[] s = products.Select(p => p.Name).ToArray();
Run Code Online (Sandbox Code Playgroud)
如果要从各个地方调用(确保一致性)或做了很多工作,我只会使用一个单独的方法.
编辑:我刚刚注意到您的描述(想要ID +名称)实际上与ProductToString
您给出的方法(仅提供名称)相匹配.对于我使用的ID +名称:
string[] s = products.Select(p => p.ID + " " + p.Name).ToArray();
Run Code Online (Sandbox Code Playgroud)
要么
string[] s = products.Select(p => string.Format("{0} {1}", p.ID, p.Name))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
或者你ProductToString
当然可以改变你的方法.
另外,您也可以覆盖ToString()
在Product
,如果这是通常你想怎么一个转换Product
到string
.然后,您可以使用方法组转换或lambda表达式来调用ToString
.
1您可能不需要明确指定类型参数 - 即:
string[] s = products.Select(ProductToString).ToArray();
Run Code Online (Sandbox Code Playgroud)
将正常工作 - 类型推断和方法组转换的规则总是让我困惑,编译器行为随着时间的推移略有变化.刚刚进行的快速测试看起来确实有效,但在略有不同的情况下可能存在微妙之处.
归档时间: |
|
查看次数: |
27278 次 |
最近记录: |