0

IEnumerable<FileInfo>比較したい2 つのリストがあります。

IEnumerable<FileInfo> list1 = dir1.GetFiles("*" + _ext1, SearchOption.AllDirectories);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*" + _ext2, SearchOption.AllDirectories);

_ext1 と _ext2 は異なるファイル拡張子タイプです。例えば:

string _ext1 = ".jpg";
string _ext2 = ".png";

したがってlist1、次のようになります。

file1.jpg
file2.jpg
file3.jpg
file4.jpg
file5.jpg
file6.jpg

次のようにlist2なります。

file1.png
file2.png
file4.png

list1 に存在しない list2 のすべてを検索したい。私は次のことを試しました:

List<string> list1FileNames = list1.Select(f => Path.GetFileNameWithoutExtension(f.FullName)).ToList();
List<string> list2FileNames = list2.Select(f => Path.GetFileNameWithoutExtension(f.FullName)).ToList();
var setDiff = list1FileNames .Except(list2FileNames );

これは素晴らしく、正常に動作し、戻ります (ファイル拡張子がないことに注意してください):

file3
file5
file6    

しかし、私が本当に望んでいるのは、FileName 文字列だけでなく、FileInfo のリストを取得することです。FullFile パス、ext.. などの他の情報が必要なため、これが必要です。そのため、ファイル名文字列のリストだけでは機能しません。どうすればこれを行うことができますか?

4

3 に答える 3

1

どうですか:

IEnumerable<FileInfo> list1 = dir1.GetFiles("*" + _ext1, SearchOption.AllDirectories);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*" + _ext2, SearchOption.AllDirectories);

IEnumerable<FileInfo> filtered = list2.Where(f2 => !list1.Any(f1 =>
    Path.GetFileNameWithoutExtension(f1.FullName) == Path.GetFileNameWithoutExtension(f2.FullName)));
于 2016-08-10T21:10:27.050 に答える
1

速度を求める場合は、次の方法を試してください。

private IEnumerable<FileInfo> GetUniqueFilesWithoutExtension(IEnumerable<FileInfo> list1, IEnumerable<FileInfo> list2)
{
    var d = new HashSet<string>();
    foreach (var fi in list2)
    {
        d.Add(Path.GetFileNameWithoutExtension(fi.FullName));
    }

    foreach (var fi in list1)
    {
        if (!d.Contains(Path.GetFileNameWithoutExtension(fi.FullName)))
        {
            yield return fi;
        }
    }
}

からファイル名 (拡張子なし) のハッシュ セットを作成しlist2、反復してlist1、 からのハッシュ セットに含まれないファイル名 (拡張子なし) を持つアイテムのみを返しますlist2。を使用yield returnすると、必要に応じて、リスト全体が生成されるのを待つのではなく、ストリーミング方式で検出された結果を使用できます。

于 2016-08-10T22:15:23.187 に答える
0

Where()そのために withを使用できますAll()が、時間の複雑さが高くなります。

var difference =  list2
                  .Where(f=>list1.All(x=>Path.GetFileNameWithoutExtension(x.FullName) != Path.GetFileNameWithoutExtension(f.FullName)); 
于 2016-08-10T21:08:40.517 に答える