2017-10-13 2 views
0

Ich möchte die foreach in dieser Methode zu einem Ausdruck Linq konvertieren. Ich habe 2 try/catchs, weil ich nicht immer auf die Strings zählen kann, die in der Liste der Guids oder guidToFind als gültige Guid-Strings übergeben werden.foreach zu linq mit guid Vergleich

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

Sie sind schnell mit den Antworten. Und, Entschuldigung, ich habe die ursprüngliche Methode so modifiziert, dass sie einen zweiten try/catch enthält ... Das ist so, dass, wenn eine der Strings in der Liste nicht gut ist und nicht in eine GUID umgewandelt werden kann, die Methode nicht funktioniert. t sofort mit false beenden. Es sollte alle Elemente in der Liste versuchen. – Kershaw

+0

Ist leer Guid könnte in der String-Liste von Guids sein? –

Antwort

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

Das macht genau das, was ich tun muss. Es gibt true zurück, wenn guidToFind in der Liste ist, gibt false zurück, wenn nicht, und alle ungültigen Guid-Zeichenfolgen in der Liste werden mit GuidTryParse behandelt. Eine Verbesserung besteht darin, den try/catch in diesem Block zu beseitigen und einen TryParse auf dem guidToFind auszuführen. Ich werde es versuchen. – Kershaw

+0

@Kershaw Ich stimme zu, dass ist ein besserer Ansatz und berücksichtigt, dass in meiner Antwort, aber es schien über den Rahmen der Frage, so dass ich nur die LINQ implementiert. –

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

Das ist nett und tight und funktioniert großartig, es sei denn, eine der GUID-Zeichenfolgen in der Liste ist ungültig.Ich würde dies als gültige Antwort empfehlen, wenn Sie wüssten, dass alle übergebenen GUID-Strings und GUIDTOFIND-Strings gültig sind. – Kershaw

+1

@Kershaw, sollten Sie 'TryParse' anstelle von fangen und schlucken Ausnahme verwenden, die hässlich ist –

+1

Sie sollten' TryParse' für die erste Konvertierung sowie –

-1

nicht so kurz und bündig wie die andere Lösung, aber ich finde es lesbar

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 für die großen Antworten, aber ich mit Jason Boyds Antwort ging, aber mit einem leichte Modifikation meiner eigenen, um den letzten Versuch/Fang loszuwerden. Ich habe diese Tests mit den Ergebnissen betreibe ich erwartet:

  • schlecht guidToFind String
  • gute guidToFind string, Liste aller gültigen guid Strings
  • gute guidToFind string, Liste der meist gültig guid Strings

    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: nach Rückmeldung von einem Code-Review mit dem obigen Verfahren, konnte ich mehr refinemen machen ts und das ist das Ergebnis:

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

Diese Antwort ist nicht besonders anders als die anderen bereits gebucht, aber ich würde dies persönlich verwenden:

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); 
    } 

Die Unterschiede sind:

  • Erweiterungsmethode (persönliche Präferenz)
  • neuere C# Funktionen z ‚Out var Ergebnis‘ (persönliche Präferenz)
  • explizit die Validierung Parameter (abhängig vom Verhalten Sie nach, aber ich bin ein großer Fan)

Der letzte Punkt führt mich zu einem allgemeinen Punkt: Wenn Ihr Programm nimmt als Eingabe eine Sammlung von Strings, die GUIDs sein sollen. Warum validieren Sie diese nicht zu der Zeit und behalten Sie IEnumerable von Guid? Tun Sie dasselbe für die GUID zu finden und der Code wird:

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

Ich mag was Sie getan haben mit relevanten Ausnahmen werfen, die nützlich sein könnten, wenn Es war erwünscht. Aber in diesem speziellen Fall ist es mir egal, was schief gelaufen ist. Ich möchte nur wissen, ob guidToFind in der Liste ist, und wenn es in guidToFind übergeben wird, ist es ungültig. Gib einfach false zurück. Dies ist sicherlich eine gültige Antwort im richtigen Kontext. – Kershaw