2017-10-13 14 views
0

このメソッドのforeachをlinq式に変換したいと思います。私は2つのtry/catchを持っています。なぜなら、guidのリストまたはguidToFindの中で渡された文字列を有効なguid文字列とみなすことはできないからです。guidの比較でlinqにforeach

他の解決策のように簡潔
public static bool IsGuidInList(List<string> guids, string guidToFind) 
    { 
     try 
     { 
      var guid = new Guid(guidToFind.Trim()); 
      foreach (var g in guids) 
      { 
       try 
       { 
        var g2 = new Guid(g.Trim()); 
        if (g2 == guid) 
         return true; 
       } 
       catch {} // swallow exception 
      } 
     } 
     catch{} // swallow exception 
     return false; 
    } 
+0

あなたは速いです。そして、申し訳ありませんが、私は2番目のtry/catchをインクルードするために元のメソッドを修正しました...これは、リスト内の文字列のどれかが良いものではない、つまりguidにキャストできないという意味で、すぐに偽で終了します。リスト内のすべての項目を試行する必要があります。 – Kershaw

+0

空ではありますか?Guidは文字列のGuidsのリストに含まれていますか? –

答えて

5
public static bool IsGuidInList(List<string> guids, string guidToFind) 
{ 
    try 
    { 
     var guid = new Guid(guidToFind.Trim()); 
     return 
      guids 
      .Select(x => 
      { 
       Guid result; 
       return Guid.TryParse(x, out result) ? (Guid?)result : null; 
      }) 
      .Where(x => x.HasValue) 
      .Any(x => x.Value == guid); 
    } 
    catch { } // swallow exception 
    return false; 
} 
+0

これはまさに私が必要とすることです。 guidToFindがリストにある場合はtrueを返し、そうでない場合はfalseを返し、リスト内の不正なguid文字列はGuidTryParseで処理されます。 1つの改善点は、このブロックでtry/catchを削除し、guidToFindでTryParseを実行することです。私はそれをやろうとします。 – Kershaw

+0

@Kershaw私はそれがより良いアプローチであり、それを私の答えに含めたことに同意しましたが、質問の範囲を超えていると思われたので、私はLINQを実装しました。 –

6
var tg = Guid.Empty; 
    guids.Any(g=> g!= null 
     && Guid.TryParse(g.Trim(), out tg) && new Guid(g.Trim()) == guid) 
+0

これは素晴らしいとタイトで、リスト内のguid文字列の1つが無効でない限りうまくいきます。渡されたすべてのguid文字列とguidToFind文字列が有効であることを知っていれば、これを有効な答えとしてお勧めします。 – Kershaw

+1

@Kershaw、例外を捕まえて飲み込む代わりに 'TryParse'を使うべきです –

+1

最初の変換にも' TryParse'を使うべきです –

-1

ませんが、私は偉大な答えを、それが読める

public static bool IsGuidInList(List<string> guids, string guidToFind) 
    { 
     Guid outGuid; 

     var inGuidToFind = Guid.TryParse(guidToFind, out outGuid) ? outGuid : Guid.Empty; 
     if (inGuidToFind == Guid.Empty) 
      return false; 

     var inGuids = new List<Guid>(); 
     guids.Where(i => Guid.TryParse(i, out outGuid)).ForEach(i => inGuids.Add(new Guid(i))); 

     return inGuids.Contains(inGuidToFind); 
    } 
1

Thxを見つけるには、しかし、私はジェイソンBoydsの答えに行きましたが、と最後のtry/catchを取り除くために私自身のわずかな変更。私は私が期待される結果とこれらのテストを実行した:

  • 悪いguidToFind列
  • 良いguidToFind文字列、すべての有効なGUID文字列
  • 良いguidToFind文字列、ほとんど有効なGUID文字列のリストのリスト

    public static bool IsGuidInList(List<string> guids, string guidToFind) 
    { 
        Guid guid; 
        if (!Guid.TryParse(guidToFind.Trim(), out guid)) 
         return false; 
    
        return 
         guids 
          .Select(x => 
          { 
           Guid result; 
           return Guid.TryParse(x, out result) ? (Guid?)result : null; 
          }) 
          .Where(x => x.HasValue) 
          .Any(x => x.Value == guid); 
    } 
    

UPDATE: 上記の方法でコードレビューからのフィードバックの後、私はより多くのrefinemenを作ることができましたTSこれが結果です:

public static bool IsGuidInList(IEnumerable<string> guids, string guidToFind) 
    { 
     Guid guid; 
     if (!Guid.TryParse(guidToFind.Trim(), out guid)) 
      return false; 

     return guids.Any(x => { Guid result; 
      Guid.TryParse(x, out result); 
      return result == guid; 
     }); 
    } 
2

この答えはすでに掲載他の人には特に違いはありませんが、私は個人的にこれを使用します。

public static bool ContainsGuid(this IEnumerable<string> guids, string guidToFind) 
    { 
     if (guids == null) throw new ArgumentNullException(nameof(guids)); 
     if (guidToFind == null) throw new ArgumentNullException(nameof(guidToFind)); 

     if (!Guid.TryParse(guidToFind, out var guid)) 
      throw new ArgumentException($"Could not convert '{guidToFind}' to a GUID"); 

     return guids 
      .Select(s => Guid.TryParse(s, out var result) ? (Guid?)result : null) 
      .Contains(guid); 
    } 

違いがあること:

  • 拡張メソッド(個人的な好み)
  • 新しいC#の特徴「うちのvar結果」(個人的な好み)
  • 明示的に有効なパラメータは、(あなたが後にしている行動に依存しますが、私は大ファンです)

最後の項目は、一般的なポイントに私をリード: の場合あなたのプログラムは、GUIDであることを意図した文字列の集合を入力として受け取り、その時点でそれらを検証せずにGuidのIEnumerableを保持するのはなぜですか?検索するGUIDと同じことをして、コードは:

IEnumerable<Guid> guidList = // validated elsewhere 
var found = guidList.Contains(guid); 
+0

関連する例外を投げてやったことが好きです。それが望まれていた。しかし、この特定のケースでは、何が問題になったのか気にしません。guidToFindがリストに含まれているかどうかを知りたいだけです。guidToFindで渡されたものが無効な場合はfalseを返します。これは確かに正しい状況で有効な答えです。 – Kershaw

関連する問題