如何用LINQ选择* some *项?

时间:2011-04-01 09:37:45

标签: c# .net linq

如何在LINQ中编写这个函数?

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的新实例。

4 个答案:

答案 0 :(得分:5)

您可以将语句而不仅仅是lambdas传递给LINQ方法:

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

答案 1 :(得分: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方法经常引发异常,那么您可能想要编写一个返回成功/失败bool的TryParse版本。 (但这无助于编写LINQ。)


修正了里面的产量 - 谢谢。这个解决方案相对于已接受的解决方案的一个小优点是它支持Parse返回null作为有效结果,但我怀疑你是否曾经需要/想要它。

答案 2 :(得分:0)

一种方法是

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

但是假设Parse()方法不会抛出异常

答案 3 :(得分: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);
    }