2017-01-08 5 views
1

Ich habe den folgenden Code, welche Gruppen eine Liste von FileInfos:mit LINQ mit if-Abfrage

  var group_infos = 
      from info in fileInfos 
      where info.Length < 1024 * 1024 
      group info by info.Name into g 
      where g.Count() > 1 
      orderby g.Count() descending, g.Key 
      select g; 

Jetzt möchte ich eine if-Abfrage auf der Gruppe-Clausel zu tun. Vielleicht mit Hilfe einer Schnur

string groupClausel = "Name"; 

oder Enum:

public enum FilterMethod 
    { 
     Directory, 
     CreationTime, 
     DirectoryName, 
     Extension, 
     Length, 
     Name 
    } 

Aber ich weiß nicht, wie die Zeichenfolge oder Enum in Gruppe-Clausel zu überprüfen .. Ich weiß, dass es sa Syntax wie

group info by (groupClausel == "Extension" ? info.Extension : info.Name) into g 

Aber lassen Sie mich wählen Sie einfach auf zwei Attribute ...

haben Sie Menschen eine Idee?

+0

Sie wollen also die mehr Bedingungen? – procma

+0

Nein, ich möchte überprüfen, welche Gruppenmethode der Benutzer möchte. Wenn er nach Name gruppieren möchte: Gruppe nach Name. Wenn er nach Länge gruppieren möchte: Gruppe für Länge. wenn er gruppieren möchte ....... – Chpo7234

Antwort

1

Sie könnten Methodensyntax anstelle von Abfragesyntax hier verwenden, es wird mehr wartbar und lesbar in meiner Meinung sein.

Zum Beispiel könnten Sie eine Methode machen, die Gruppe, die durch Schlüsselauswahlfunktion zurückgibt:

private Func<FileInfo, object> GetGroupByKeySelector(FilterMethod filterMethod) 
{ 
    Func<FileInfo, object> keySelector = null; 
    switch (filterMethod) 
    { 
     case FilterMethod.Directory: 
      keySelector = f => f.Directory; 
      break; 

     case FilterMethod.CreationTime: 
      keySelector = f => f.CreationTime; 
      break; 

     case FilterMethod.DirectoryName: 
      keySelector = f => f.DirectoryName; 
      break; 

     case FilterMethod.Extension: 
      keySelector = f => f.Extension; 
      break; 

     case FilterMethod.Length: 
      keySelector = f => f.Extension; 
      break; 

     default: 
      keySelector = f => f.Name; 
      break; 
    } 
    return keySelector; 
} 

Und dann können Sie es verwenden, wie unten beschrieben:

FilterMethod prop = FilterMethod.CreationTime; 
var groupInfos = fileInfos 
    .Where(f => f.Length < 1024 * 1024) 
    .GroupBy(GetGroupByKeySelector(prop)) 
    .Where(g => g.Count() > 1) 
    .OrderByDescending(g => g.Count()) 
    .OrderBy(g => g.Key) 
    .Select(g => g); 

Additionaly Sie System verwenden können .Net.Reflection-Bibliothek zu vermeiden switch-case innerhalb GetGroupByKeySelector Methode, wenn Ihr enum FileInfo Eigenschaftsnamen widerspiegelt.