2013-03-22 3 views
1

Я пытаюсь подражать следующий код питона с помощью лямбда-х:Что такое эквивалентная лямбда?

checkName = lambda list, func: func([re.search(x, name, re.I) for x in list]) 

if checkName(["(pdtv|hdtv|dsr|tvrip).(xvid|x264)"], all) and not checkName(["(720|1080)[pi]"], all): 
    return "SDTV" 
elif checkName(["720p", "hdtv", "x264"], all) or checkName(["hr.ws.pdtv.x264"], any): 
    return "HDTV" 
else: 
    return Quality.UNKNOWN 

Я создал следующий C# код для длинного формата, но я уверен, что это может быть сокращено с помощью лямбда-выражения:

if (CheckName(new List<string> { "(pdtv|hdtv|dsr|tvrip).(xvid|x264)" }, fileName, true) == true & 
    CheckName(new List<string> { "(720|1080)[pi]" }, fileName, true) == false) 
{ 
    Quality = Global.EpisodeQuality.SdTv; 
} 

private bool CheckName(List<string> evals, string name, bool all) 
{ 
    if (all == true) 
    { 
    foreach (string eval in evals) 
    { 
     Regex regex = new Regex(eval, RegexOptions.IgnoreCase); 
     if (regex.Match(name).Success == false) 
     { 
     return false; 
     } 
    } 

    return true; 
    } 
    else 
    // any 
    { 
    foreach (string eval in evals) 
    { 
     Regex regex = new Regex(eval, RegexOptions.IgnoreCase); 
     if (regex.Match(name).Success == true) 
     { 
     return true; 
     } 
    } 
    return false; 
    } 
} 

Любая помощь была бы признательна за улучшение моего понимания! Поскольку я уверен, что есть более короткий/более простой способ!

Так после того, как несколько больше играть, я сократил его:

private static bool CheckName(List<string> evals, 
          string name, 
          bool all) 
    { 

     if (all == true) 
     { 
      return evals.All(n => 
      { 
       return Regex.IsMatch(name, n, RegexOptions.IgnoreCase); 
      }); 
     } 
     else 
     // any 
     { 
      return evals.Any(n => 
      { 
       return Regex.IsMatch(name, n, RegexOptions.IgnoreCase); 
      }); 
     } 
    } 

Но должен быть эквив с помощью Func как код питона?

+1

Просто помните, 'All' возвращает истину, если' evals' пуст. –

ответ

1

Что-то вроде этого:

private bool CheckName(List<string> evals, string name, bool all) 
{ 
    return all ? !evals.Any(x => !Regex.IsMatch(name, x, RegexOptions.IgnoreCase)) 
       : evals.Any(x => Regex.IsMatch(name, x, RegexOptions.IgnoreCase)); 
} 

Func:

List<string> list = new List<string>(); 

Func<string, bool, bool> checkName = (name, all) => all 
    ? !list.Any(x => !Regex.IsMatch(name, x, RegexOptions.IgnoreCase)) 
    : list.Any(x => Regex.IsMatch(name, x, RegexOptions.IgnoreCase)); 

checkName("filename", true) 
+0

Я предполагаю, что я думал, что нужно использовать Func? – user2198959

+0

И он не работает – user2198959

+0

обновлено, мне пришлось перечитать вопрос (его поздний) :) –

0
private bool CheckName(string eval, string name) 
{ 
    return new Regex(eval, RegexOptions.IgnoreCase).Match(name).Success; 
} 

private bool CheckName(List<string> evals, string name, bool all) 
{ 
    if (all == true) 
    { 
    return !evals.Any(eval => !CheckName(eval, name)); 
    } 
    else 
    { 
    return evals.Any(eval => CheckName(eval, name)); 
    } 
} 
Смежные вопросы