2016-07-21 16 views
1

Ist es möglich, eine Linq-Abfrage wie unten mit einem Rückgabetyp zurückzugeben, oder ist es schreibgeschützt wie eine foreach-Anweisung?LINQ gibt einen Wert IEnumerable zurück

Danke!

var s = "sean oneill, 26/06/1985; matt sheridan, 22/09/1984; Jenny Hutching, 21/03/1972"; 

var s9 = ParseDateOfBirth(s); 

private string ParseDateOfBirth(string info) 
{ 
     return info.Split(';').Select(n => n.Split(',')).Select(n => new { name = n[0].Trim(), datetime = DateTime.ParseExact(n[1], "d/M/yyyy", CultureInfo.InvariantCulture)}); 
} 
+0

Haben Sie versucht, es einfach auszuführen, um herauszufinden? –

+0

Was meinst du? Möchten Sie, was Sie in der Abfragesyntax geschrieben haben, oder versuchen Sie, einen IEnumerable von Ihrer Methode zurückzugeben? Wenn die zweite Sie einen Typ deklarieren müssen und nur 'IEnumerable ' zurückgeben. Wenn die erste dann –

Antwort

2

Ihr linq-Ausdruck gibt am Ende ein anonymen Objekt zurück. Daher können Sie die Zeichenfolge nicht als Rückgabetyp Ihrer Methode verwenden.

können Sie dynamisch verwenden als Typ

private dynamic ParseDateOfBirth(string info) 
{ 
     return info.Split(';') 
      .Select(n => n.Split(',')) 
      .Select(n => new { 
        name = n[0].Trim(), 
        datetime = DateTime.ParseExact(n[1].Trim(), 
                "d/M/yyyy", 
                CultureInfo.InvariantCulture) }); 
} 

Oder noch besser, erstellen Sie ein DTO die Daten darzustellen, Sie kehren zurück und verwenden, die

public class UserInfo 
{ 
    public string Name { set; get; } 
    public DateTime Datetime { set; get; }   
} 

private IEnumerable<UserInfo> ParseDateOfBirth(string info) 
{ 
    return info.Split(';').Select(n => n.Split(',')) 
       .Select(n => new UserInfo { 
          Name = n[0].Trim(), 
          Datetime = DateTime.ParseExact(n[1].Trim(), 
              "d/M/yyyy", CultureInfo.InvariantCulture) }); 

} 

Wenn Sie nun mit der diese Methode aufrufen Eingangs

var s = "sean oneill, 26/06/1985; matt sheridan, 22/09/1984; Jenny Hutching, 21/03/1972"; 

var result = ParseDateOfBirth(s); 

die Variable result wird eine Sammlung von 3seinObjekte.

+0

Sie müssen die Datumszeichenfolge trimmen, bevor Sie es verbinden: 'DateTime.ParseExact (n [1] .Trim()' –

+0

@JamesCurran Gute Fang. ParseExact wird fehlschlagen, wenn Sie das nicht tun. Ich aktualisierte die Antwort – Shyju

+0

Vielen Dank für die Hilfe, sehr geschätzt. – gkhan