今日プロジェクトに取り組んでいるときに、.NET でこの奇妙な動作に遭遇しました。
ファイル名のリストを取得してオブジェクトに追加しています。ただし、これを行うようになった「悪い」名前の既知のリストに対して着信名をフィルター処理する必要があります。(私は決して高度な C# コーダーではなく、まだ学習中です。) ただし、aspnet_wp.exeプロセスが無期限に 100% で実行されるため、言語に何か問題があると思います。
参照用の私のコードは次のとおりです。
List<string> localFiles = new List<string>();
// I was worried the object was causing the issue so dumbed it down to this with no changed.
string path = "//<file share>/<dir>/";
// As I commented below yes, it's slow when it works but it's clearly not working when using the if();
List<string> omitNames = new List<string>();
omitNames.Add("Thumbs.db");
// This is the only item in the list when it breaks also.
FileInfo[] localFileList = new DirectoryInfo(path).GetFiles();
foreach ( FileInfo item in localFileList )
{
if(!omitNames.Contains(item.Name))
{
localFiles.Add(path + itemName);
}
}
このコードが無限ループとして実行される理由を誰か説明できますか? 本当にいけないようです。また、を使用するのList
が最善の方法ではない可能性があることも認識しています。これをきれいに実装する別の方法はありますか?
if(!){}
for をコメントアウトするとomitNames
、コードを正しく実行できます。(もちろん、結果はフィルタリングされていません。)
更新:以下にあるコンソール アプリにこれを配置するように要求されました。しかし、それは完全に機能します。もう 1 つのことは、単純に文字列と比較してみることを誰かが提案したことです。しかし、これを次のように変更すると、まったく同じことが起こります。
if(item.Name != "Thumbs.db")
{
localFiles.Add(path + itemName);
}
コンソール アプリ (動作):
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LoopKiller
{
class Program
{
static void Main(string[] args)
{
List<string> omitNames = new List<string>();
List<string> localFiles = new List<string>();
omitNames.Add("Thumbs.db");
FileInfo[] localFileList = new DirectoryInfo("c:/test/").GetFiles();
foreach (FileInfo item in localFileList)
{
if (!omitNames.Contains(item.Name))
{
Console.WriteLine("Adding " + item.Name + " to localFiles.");
localFiles.Add(item.Name);
Console.WriteLine("Item added to localFiles.");
}
}
foreach (string item in localFiles)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
}