1

If I have the following working code:

List<MyClass> results = new List<MyClass>();

for(int i = 0; i < source.Count; i++)
  try{ results.Add(Fetch(source[i])); }
  catch(Exception ex){ results.Add(new MyClass("poof!")); }
...
public MyClass Fetch(Object source){ ... }

and would like to remake it into LINQ, how can I manage the try-catch? If I put it around the following expression, It's not going to poof me. My suggestion would be to migrate catching into the method but I'm not sure how optimal/recommended that is. Can one tell at all or is depending on specifics of the scenario?

IEnumerable<String> strings = source.Select(e => Fetch(e));

public MyClass Fetch(Object source){ try{ ... } catch(){ ... } }

It'd be cool with something like this pseudo-code. I'm thinking the method .First() and it's more-potent brother .FirstOrDefault(), but with additional capacity.

IEnumerable<String> strings = source.Select(e => Fetch(e)).Excepted(...);

Am I way off?

4

4 に答える 4

2

最善の策は、try / catchブロックを別のメソッドに移動し、そのメソッドをセレクターとして使用することです。

public MyClass FetchOrDefault(object source){ 
  try { 
    return Fetch(source);
  } catch (Exception ex) { 
    return new MyClass("poof");
  }
}

// Method call syntax
var e = source.Select(x => x.FetchOrDefault(x));

// LINQ syntax
var e = from x in source select FetchOrDefault(x);
于 2013-03-04T15:38:01.433 に答える
0

最も簡単な解決策は、すでに行ったことを実行することです。つまり、コードブロックを含めることができます。

IEnumerable<String> strings = source.Select(e =>
{
try
  {
    return Fetch(e);
  }
catch
 {
    return new MyClass("poof");
 }
}
);
于 2013-03-04T15:41:26.463 に答える
0

Exceptedクラスを作成できるとは思いませんがSelect、2つのセレクターを使用してメソッドを作成できます。1つはエラーの場合です。

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,
    Func<TSource, TResult> selector, Func<TSource, TResult> secondarySelector)
{
    foreach (var item in source)
    {
        TResult nextValue;
        try
        {
            nextValue = selector(item);
        }
        catch
        {
            nextValue = secondarySelector(item);
        }

        yield return nextValue;
    }
}

次に、それはあなたがすることを可能にするでしょう:

var results = source.Select(item => Fetch(item)
    , item => new MyClass("poof!"))
    .ToList();

必要に応じて、セカンダリセレクターで例外をパラメーターとして受け取ることもできます。

于 2013-03-04T15:41:33.860 に答える
0

元のコードと同じ動作が得られます

List<String> results = source.Select(e => { try
                                            {
                                                return Fetch(e);
                                            }
                                            catch(Exception)
                                            {
                                                 return MyClass("poof");
                                            }
                                          }).ToList();

しかし、このように try/catch を使用することを再考する必要があると思います。これはパフォーマンス コストが非常に高く、例外的でないケースを処理するためのものではありません。最初eにフェッチ可能かどうかを確認し、次のようにすることをお勧めします

List<String> results = source.Where(e => IsFetchable(e))
                             .Select(e => Fetch(e))
                             .ToList();
于 2013-03-04T15:40:41.743 に答える