2017-10-13 17 views
0

이 메서드에서 foreach를 linq 표현식으로 변환하고 싶습니다. 유효한 guid 문자열이 guid 또는 guidToFind 목록에 전달 된 문자열을 항상 셀 수는 없기 때문에 2 try/catch 있습니다.foreach를 linq to guid 비교

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

여러분은 응답이 빠릅니다. 그리고 미안 해요, 두 번째 try/catch 포함하도록 원래 메서드를 수정 ... 목록의 문자열 중 하나가 좋지 않은 경우, 즉 GUID로 캐스팅 될 수 없다는 것을 의미하므로이 메서드는 ' 즉시 false로 종료하십시오. 목록의 모든 항목을 시도해야합니다. – 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로 처리됩니다. 한 가지 개선 사항은이 블록에서 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 문자열 중 하나가 유효하지 않으면 멋지고 빡빡합니다.전달 된 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

들으은, 그러나 나는 제이슨 Boyds 응답 갔다 찾을 수 있지만 마지막 시도/제거를 제거하기 위해 내 자신의 약간의 수정. 나는 내가 기대했던 결과에 테스트를 실행 한 :

  • 나쁜 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