如何在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的新实例。
答案 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);
}