2016-04-08 26 views
1

başlık, bir ağız dolusu ve doğru olduğundan emin bile değil (this'dan fazla bir şey ifade edemedi), bu yüzden C#'da neyi başarmak istediğimi açıklamaya çalışacağım javascript. Bu soruya neleri koymam gerektiği ile ilgili herhangi bir öneri çok hoş geldiniz.C# inline lambda ifadesi

string key = (function(entity) { 
    switch(entity) { 
     case "a": 
      return "foo"; 
     case "b": 
      return "bar"; 
     default: 
      return "baz"; 
    } 
}(/* "a", "b", or something else */)); 
:

Func<string, string> getKey = entity => { 
    switch(entity) { 
     case "a": 
      return "foo"; 
     case "b": 
      return "bar"; 
     default: 
      return "baz"; 
    } 
}; 

string key = getKey(/* "a", "b", or something else */); 

Şimdi açıkça getKey işlevi tanımlayın ama bu eşdeğer javascript snippet'indeki olduğu gibi anonim kullanmak istemiyorum varsayalım: C# yılında
, bu fonksiyon tanımladıysanız demek

C# numaralı telefondan bunu nasıl yazarım? Denedim:

string key = (entity => { 
    switch(entity) { 
     case "a": 
      return "foo"; 
     case "b": 
      return "bar"; 
     default: 
      return "baz"; 
    } 
})(/* "a", "b", or something else */); 

ama sözdizimi hatası CS0149: Method name expected olsun.
Şimdiden teşekkürler, şerefe.

+1

C# inline lambda ifadesi olarak adlandırabilirsiniz – DDan

cevap

6

IMO, en yakın eşdeğer şudur:

var key = new Func<string, string>(entity => 
{ 
    switch (entity) 
    { 
     case "a": 
      return "foo"; 
     case "b": 
      return "bar"; 
     default: 
      return "baz"; 
    } 
})("a"); 
+3

.Invoke ("a") gerekmez .... sadece ("a") – iggymoran

+1

@iggymoran: Haklısınız, güncelleştireceğim. – Dennis

+0

@iggymoran Ben de aynı şeyi yazmak üzereydim; Önce ("a") ile denedim ve bir çekicilik gibi çalıştı, teşekkürler @Dennis! –

0

C# bir derlenmiş dil ve şekillerde bir dizi javascript dolayısıyla farklıdır. Aradığın şey bir kapanış https://en.wikipedia.org/wiki/Closure_(computer_programming). Ve bunlar C# ile mümkündür (örneğin Linq).

Ama uzatma yöntemleri ile güzel çözülebilir aradıklarını düşünüyorum (https://msdn.microsoft.com/en-us//library/bb383977.aspx):

using ExtensionMethods; 
using System; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("a".ConvertKey()); 
     } 
    } 
} 

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static string ConvertKey(this String key) 
     { 
      switch (key) 
      { 
       case "a": 
        return "foo"; 
       case "b": 
        return "bar"; 
       default: 
        return "baz"; 
      } 
     } 
    } 
} 

DÜZENLEME: Linq kullanarak aynı programı:

using System; 
using System.Linq; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(new[] { "a" }.Select(entity => 
      { 
       switch (entity) 
       { 
        case "a": 
         return "foo"; 
        case "b": 
         return "bar"; 
        default: 
         return "baz"; 
       } 
      }).First()); 
      Console.ReadKey(); 
     } 
    } 
} 
Sen düşünebiliriz

" Fonksiyonel olarak "as" haritası seçiniz. Bu yardımcı olur umarım!

+0

I * Kapatmalarla ilgili bir şey olduğunu biliyordum, çünkü bunun anlamı 'javascript' kodunun da anlamı bu. Sadece Cevabınızı Hakkında terimini :) –

+0

kullanarak chickened: düzgün, ama yol çok hantal, benim tüm fikir Ben sadece tek bir yerde kapamaya ihtiyaç beri * * kodu kaydetmek için vardı; aksi halde bir uzatma yöntemi de benim seçimim olurdu. –

+0

Tamam. Linq'i listeler üzerinde kapaklar yazmak için kullanabilirsiniz (ancak tek bir değerle bir dizi oluşturmak zorunda kaldığım örnekte göreceğiniz gibi, tek değerde çalışmazlar). Linq ile önceki program: –