Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何简化和优化此C#代码_C#_Performance_Optimization_Foreach - Fatal编程技术网

如何简化和优化此C#代码

如何简化和优化此C#代码,c#,performance,optimization,foreach,C#,Performance,Optimization,Foreach,我有这样一种方法: public ConcurrentBag<FileModel> GetExceptionFiles(List<string> foldersPath, List<string> someList) { for (var i = 0; i < foldersPath.Count; i++) { var index = i; new Thread(delegate() {

我有这样一种方法:

public ConcurrentBag<FileModel> GetExceptionFiles(List<string> foldersPath, List<string> someList)
{
    for (var i = 0; i < foldersPath.Count; i++)
    {
        var index = i;

        new Thread(delegate()
        {
            foreach (var file in BrowseFiles(foldersPath[index]))
            {
                if (file.Name.Contains(someList[0]) || file.Name.Contains(someList[1]))
                {
                    using (var fileStream = File.Open(file.Path, FileMode.Open))
                    using (var bufferedStream = new BufferedStream(fileStream))
                    using (var streamReader = new StreamReader(bufferedStream))
                    ...
我现在要做的是将这一行替换为检查列表中所有元素的内容
someList

我该怎么做

编辑

现在我用if(someList.Any(item=>file.Name.Contains(item))if替换了这一行。


下一个问题是,知道
foldersPath
中的每个项目在我的网络中都是一个单独的硬盘驱动器(通常不超过5个硬盘驱动器)。

您可以使用类似
if(someList.Any(item=>file.Name.Contains(item))


这将迭代
someList
中的每个项,并检查文件名中是否包含任何项,返回一个布尔值以指示是否找到任何匹配项您可以使用类似
if(someList.any(item=>file.name.Contains(item))

这将迭代
someList
中的每个项目,并检查文件名中是否包含任何项目,首先返回一个布尔值以指示是否找到任何匹配项

有一句老话是计算机科学,“CS中有两个难题,命名、缓存失效和逐个错误。”

不要对循环使用
,除非您必须这样做,否则您获得的微小性能增益不值得调试时间(假设此版本的.net中存在任何性能增益)

其次

新线程
。不要那样做。线程的创建速度非常慢,并且会占用大量资源,特别是对于这样一个生命周期很短的进程。除此之外,在线程之间传递数据还存在开销。如果必须执行短期线程,请使用
ThreadPool.QueueUserWorkItem(WaitCallback)

然而,正如我先前提到的那样。线程是CPU资源的抽象。我真的怀疑你是CPU的束缚。穿线的成本比你想象的要高。坚持单线程。但是,您受到I/O的限制,因此要充分利用异步I/O

public async Task<IEnumerable<FileModel>> GetExceptionFiles(List<string> foldersPath, List<string> someList)
{
    foreach (var folderPath in foldersPath)        
    foreach (var file in BrowseFiles(folderPath))
    {
         if (false == someList.Any(x => file.Name.Contains(x, StringComparer.InvariantCultureCaseIgnore)))
             continue;
         using (var fileStream = await File.OpenTaskAsync(file.Path, FileMode.Open))
         using (var bufferedStream = new BufferedStream(fileStream))
         using (var streamReader = new StreamReader(bufferedStream))
         ...
             yield return new FileModel();
public异步任务GetExceptionFiles(List foldersPath,List someList)
{
foreach(foldersPath中的var folderPath)
foreach(BrowseFiles(folderPath)中的var文件)
{
if(false==someList.Any(x=>file.Name.Contains(x,StringComparer.InvariantCultureCaseIgnore)))
继续;
使用(var fileStream=await File.opentaskanc(File.Path,FileMode.Open))
使用(var bufferedStream=new bufferedStream(fileStream))
使用(var streamReader=newstreamreader(bufferedStream))
...
返回新的FileModel();
轻浮

有一句老话是计算机科学,“CS中有两个难题,命名、缓存失效和逐个错误。”

不要对
循环使用
,除非您必须这样做,否则您获得的微小性能增益不值得调试时间(假设此版本的.net中存在任何性能增益)

其次

新建线程
。不要这样做。线程的创建速度非常慢,并且会占用大量资源,特别是对于这样的短期进程。此外,在线程之间传递数据会有开销。如果必须执行短期线程,请改为使用
ThreadPool.QueueUserWorkItem(WaitCallback)

然而,正如我之前提到的。线程是CPU资源的抽象。我真的怀疑您是否受CPU限制。线程的成本将比您想象的要高。坚持使用单线程。无论您受I/O限制,因此充分利用异步I/O

public async Task<IEnumerable<FileModel>> GetExceptionFiles(List<string> foldersPath, List<string> someList)
{
    foreach (var folderPath in foldersPath)        
    foreach (var file in BrowseFiles(folderPath))
    {
         if (false == someList.Any(x => file.Name.Contains(x, StringComparer.InvariantCultureCaseIgnore)))
             continue;
         using (var fileStream = await File.OpenTaskAsync(file.Path, FileMode.Open))
         using (var bufferedStream = new BufferedStream(fileStream))
         using (var streamReader = new StreamReader(bufferedStream))
         ...
             yield return new FileModel();
public异步任务GetExceptionFiles(List foldersPath,List someList)
{
foreach(foldersPath中的var folderPath)
foreach(BrowseFiles(folderPath)中的var文件)
{
if(false==someList.Any(x=>file.Name.Contains(x,StringComparer.InvariantCultureCaseIgnore)))
继续;
使用(var fileStream=await File.opentaskanc(File.Path,FileMode.Open))
使用(var bufferedStream=new bufferedStream(fileStream))
使用(var streamReader=newstreamreader(bufferedStream))
...
返回新的FileModel();

你确定这些线程确实加速了整个过程吗?无论如何,你都应该受到I/O的限制。HOLY$%&你正在创建大量线程,甚至没有使用线程池。首先,你不应该使用像C这样的现代计算机编程语言来处理这样的事情(Java,胡说八道)。使用async await。在问题文本中,您要求简化代码,而在标记中,您列出优化和性能。这些目标可能相互矛盾。@Lucastzesniewski,我想(是的),因为
foldersPath
中的每个文件夹实际上都是一个单独的硬盘驱动器,不应该这样问吗?你确定这些线程实际上加速了整个过程吗?无论如何,你应该是I/O绑定的。HOLY.%&你正在创建大量线程,甚至没有使用线程池。首先,你不应该使用现代线程像C#这样的计算机编程语言(Java,快去吧)。使用async Wait。在你的问题文本中,你要求简化代码,而在你的标记中,你列出优化和性能。这些可能是相互矛盾的目标。@Lucastzesniewski,我想(是的),因为
foldersPath
中的每个文件夹实际上都是一个单独的硬盘驱动器。这不应该被问到吗?它应该是
Any
而不是
All
。当我编辑它时发现了这一点以添加更多的解释。谢谢@DirkIt应该是
Any
而不是
All
。在我被编辑时发现了我想多加一点解释。谢谢@Dirk