C# 字符串的对象为空。任意(f=>;)

C# 字符串的对象为空。任意(f=>;),c#,.net,C#,.net,我有一个功能: public bool IsValidFileSelection(string[] fileNames) { bool isValid = false; // There is no need to check the file types here. // As it is been restricted by the openFileBrowse if (fileNames != null && fileNames.Count()

我有一个功能:

public bool IsValidFileSelection(string[] fileNames)
{
   bool isValid = false;

   // There is no need to check the file types here.
   // As it is been restricted by the openFileBrowse

   if (fileNames != null && fileNames.Count() > 0)
   {
      if (fileNames.Count() == 1 && 
            fileNames.Any( f => Path.GetExtension(f) == ".jpg" 
                               || Path.GetExtension(f) == ".png")) 
      {
          isValid = true;
      }
      else
      {
          // If multiple files are there. none shoulf be of type .lfa
          isValid = fileNames.Any( f => Path.GetExtension(f) == ".jpg" 
                              || Path.GetExtension(f) == ".png");
       }
   }

   return isValid;
}

我似乎不明白为什么我使用字符串[]。Any(f=>Path.GetExtension(f)为f返回一个空对象。我用它来尝试查看在多选打开的文件对话框中我的文件对象是否都是jpg或png,因为它们是我想要允许的唯一类型。这不是最好的方法吗?为什么我的对象(f)空?

以下是我如何简化此过程并使其更快(通过避免对
.Any()
.Count()
的不必要调用)

这是我使用的测试套件

    static void Main(string[] args)
    {
        var p = new Program();

        Debug.Assert(p.IsValidFileSelection()==false);
        Debug.Assert(p.IsValidFileSelection("a.jpg")==true);
        Debug.Assert(p.IsValidFileSelection("a.png")==true);
        Debug.Assert(p.IsValidFileSelection("a.jpg", "a.png")==true);
        Debug.Assert(p.IsValidFileSelection("a.jpg", "a.png", "a.lfa")==false);
        Debug.Assert(p.IsValidFileSelection("a.lfa")==false);
        Debug.Assert(p.IsValidFileSelection("a.png",null)==false);
    }

下面是我将如何简化此过程并使其更快(通过避免对
.Any()
.Count()
的不必要调用)

这是我使用的测试套件

    static void Main(string[] args)
    {
        var p = new Program();

        Debug.Assert(p.IsValidFileSelection()==false);
        Debug.Assert(p.IsValidFileSelection("a.jpg")==true);
        Debug.Assert(p.IsValidFileSelection("a.png")==true);
        Debug.Assert(p.IsValidFileSelection("a.jpg", "a.png")==true);
        Debug.Assert(p.IsValidFileSelection("a.jpg", "a.png", "a.lfa")==false);
        Debug.Assert(p.IsValidFileSelection("a.lfa")==false);
        Debug.Assert(p.IsValidFileSelection("a.png",null)==false);
    }

已经选择了一个解决方案,但为了完整起见,我将包括一个LINQ选项:

public bool IsValidFileSelection(params string[] filenames)
{
    if (filenames == null || filenames.Length == 0)
        return false;

    return filenames.All(f => f != null && 
               (Path.GetExtension(f) == ".jpg" || Path.GetExtension(f) == ".png"))
}

已经选择了一个解决方案,但为了完整起见,我将包括一个LINQ选项:

public bool IsValidFileSelection(params string[] filenames)
{
    if (filenames == null || filenames.Length == 0)
        return false;

    return filenames.All(f => f != null && 
               (Path.GetExtension(f) == ".jpg" || Path.GetExtension(f) == ".png"))
}

很可能
fileNames
包含一个空值。但您的逻辑目前非常奇怪。为什么要调用
Count()
?为什么在两个不同的地方出现相同的情况?为什么在注释中引用lfa文件,而不在代码中?如果
,为什么还要有内部
?检查
是否有一个或多个
都有效。此代码可以大大简化。对于初学者,
fileNames.Count()
应该是
fileNames.Length
,并且在您的检查中,
fileNames.Length==1
,之后没有理由使用LINQ,因为您刚刚确认
fileNames
只包含一个成员,可以被
fileNames[0]
引用。更不用说重复的代码
。Any()
有复制/粘贴编程的味道。不允许使用“.JPG”和“.PNG”吗?很可能
文件名
包含空值。但您的逻辑目前非常奇怪。为什么要调用
Count()
?为什么在两个不同的地方出现相同的情况?为什么在注释中引用lfa文件,而不在代码中?如果
,为什么还要有内部
?检查
是否有一个或多个
都有效。此代码可以大大简化。对于初学者,
fileNames.Count()
应该是
fileNames.Length
,并且在您的检查中,
fileNames.Length==1
,之后没有理由使用LINQ,因为您刚刚确认
fileNames
只包含一个成员,可以被
fileNames[0]
引用。更不用说重复的代码
。Any()
复制/粘贴编程的味道。是“.JPG”和“.PNG”不允许?您可能还想在那里包括一个
项==null
签入,因为OP的问题涉及
文件名中的一个对象为null。哦,是的。我忘了。我现在正在编辑。谢谢@abion47正如我所看到的,除了数组中的最后一项之外,您可以忽略所有项,这就是为什么您可以将整个循环更改为
lastordefaultt
命令。@DmitryBychenko…不,他不是?他正在迭代每个元素并单独检查它。
LastOrDefault
使用起来会很笨拙。如果有什么问题的话,循环可以替换为
Any
,但这只是为了代码的整洁,因为手动方法几乎总是比等效的LIN快Q方法。@ja72:您的实现没有问题(它确实通过了测试,+1),但我个人怀疑性能是否是上下文中的问题(通过
目录获取
arg
。GetFiles
或类似的过程非常耗时);真正的问题,IMHO,是可读性,这是问题的主要原因。你可能想在那里包括一个
item==null
检查,因为OP的问题涉及
filenames
中的一个对象为null。哦,是的。我忘了。我现在正在编辑。谢谢@abion47正如我所见,你忽略了所有内容,但arr中的最后一项除外是的,这就是为什么您可以将整个循环更改为
LastOrDefault
命令的原因。@DmitryBychenko…不,他不是?他正在迭代每个元素并逐个检查。
LastOrDefault
使用起来会很笨拙。如果有什么问题,可以用
Any
替换该循环,但这只是为了代码的整洁e手动方法几乎总是比等效的LINQ方法快。@ja72:您的实现没有问题(它确实通过了测试,+1),但我个人怀疑上下文中是否存在性能问题(通过
目录获取
arg
。GetFiles
或类似的方法是一个耗时的过程);IMHO,真正的问题是可读性,这是问题的主要原因。