1

ラムダを使用して次のPythonコードをエミュレートしようとしています:

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

しかし、Python コードのような Func を使用する同等のものがあるに違いありませんか?

4

2 に答える 2

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

機能:

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) 
于 2013-03-22T11:32:54.043 に答える
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));
  }
}
于 2013-03-22T11:30:11.780 に答える