2011-04-01 56 views
2

如何在LINQ中编写这个函数?如何用LINQ选择* some *项目?

public List<TResult> select(List<string> source) 
{ 
    List<TResult> result = new List<TResult>(); 
    foreach (var a in source) 
    { 
     try { result.Add(TResult.Parse(a)); } 
     catch { } 
    } 
    return result; 
} 

我想只选择可转换为TResult的项目。 TResult.Parse()返回TResult的新实例。

+0

有什么不对当前的代码?它不是做你想做的事吗? – Bazzz 2011-04-01 09:43:17

+0

我想写一个扩展函数IEnumerable (SafeSelect) – Poma 2011-04-01 09:47:31

回答

5

你可以通过报表不只是lambda表达式的LINQ方法:

var results = source.Select(item => 
    { 
    try 
    { 
     return TResult.Parse(item); 
    } 
    catch 
    { return null; } 
    }).Where(result => result != null).ToList(); 
0

一种方法是

List<TResult> result = source.Where(TResult.Parse(a) != default(TResult)).ToList() 

但是,假定解析()方法不抛出异常

+2

请注意,源和结果是不同的类型和'Where'子句返回相同的类型,它适用于 – Poma 2011-04-01 09:45:59

+0

这将不会编译... – 2011-04-01 09:57:31

+1

也是有点有趣的是,当qeustion清楚地表明它们是 – sehe 2011-04-01 10:02:35

1

不完全是LINQ,但您可以编写一个迭代器产量解决方案,以一次完成:

public static IEnumerable<TResult> SelectParse<TResult>(
             this IEnumerable<string> source) 
{ 
    foreach(string a in source) 
    { 
     TResult parsed; 
     try 
     { 
      parsed = TResult.Parse(a); 
     } 
     catch 
     { 
      continue; 
     } 
     yield return parsed; 
    } 
} 

List<TResult> results = source.SelectParse<TResult>().ToList();

但是如果你的Parse方法经常产生异常,那么你可能想要写一个版本的TryParse返回一个成功/失败布尔代替。 (虽然这不会帮助编写LINQ。)


修复了yield-inside-try - thanks。这个解决方案比接受的解决方案的小优点是它支持Parse返回null作为有效结果,但是我怀疑你是否需要/想要这样。

+0

时,没有抛出任何异常。您忘记了'无法用catch子句在try块的主体中​​产生值',但它很容易修复。 – Poma 2011-04-01 10:32:58

+0

哎呀 - 是的,我确实怀疑那是否真的合法,因为我输入了它。很好,谢谢。 – Rup 2011-04-01 10:39:24

0

你有访问定义Parse,如果是的话它有一个TryParse方法,或者你可以创建一个类..

public class TResult 
    { 
     public static TResult Parse(string text) 
     { 
      //Parse here 
      return new TResult(); 
     } 
     public static bool TryParse(string text, out TResult mc) 
     { 
      try 
      { 
       mc = Parse(text); 
       return true; 
      } 
      catch(Exception ex) 
      { 
       mc = null; 
       return false; 
      } 
     } 
    } 

然后

public IEnumerable<TResult> Select(IEnumerable<string> result) 
    { 
     return result.Select(r=> 
      { 
       TResult item = null; 
       TResult.TryParse(r, item); 
       return item; 
      }).Where(item=>item != null); 
    }