1

私は2つList<string>listOfFullPathsたとえば「C:\ MyDir \ SomeDir \ SomeDatabase.mdf」の完全なデータベースパスを含む)と、データベースの名前の一部List<string>を含む他のいくつか(のみ)('listOfDatabases')を持っています。したがって、それぞれに含まれる可能性があります

List<string> listOfFullPaths = new List<string>() 
{
    "C:\MyDir\SomeDir\SomeDatabase1.mdf",
    "C:\MyDir\SomeDir\SomeDatabase2.mdf",
    "C:\MyDir\SomeDir\SomeDatabase3.mdf"
};

他のちょうど

List<string> listOfFullPaths = new List<string>() 
{
    "SomeDatabase1",
    "SomeDatabase2"
};

私の質問は、対応するデータベースが含まれている、継続されたフルパスを返す最も効率的な方法は何ですか?listOfFullPathslistOfDatabases

注:答えは次のようなものではありません

List<string> tmpList = new List<string>();
foreach (string database in listOfDatabases)
    if (listOfFullPaths.Contains(database))
        tmpList.Add(database);
listOfFullPaths.Clear();
listOfFullPaths = tmpList;

これは私が望むことをしますが。

4

5 に答える 5

4

パフォーマンス上の懸念から、ネストされたループを拒否しているようですね? もしそうなら、この問題にアプローチする別の方法は次のとおりです。

var set = new Set<string>(listOfDatabases);
var list = new List<string>();
foreach (string fullPath in listOfFullPaths) {
  var name = Path.GetFileNameWithoutExtension(fullPath);
  if (set.Contains(name)) {
    list.Add(fullPath);
  }
}
listOfFullPaths = list;
于 2012-05-11T17:50:05.297 に答える
3
var fileNames = listOfFullpaths.Select(x => Path.GetFileNameWithoutExtension(x));
listOfFullPaths = listofDatabases.Where(x => fileNames.Contains(x)).ToList();

listOfFullPathsがデータベース名でソートされていることを事前に知っている場合は、それをはるかに効率的にすることができることに注意してください。

于 2012-05-11T17:50:37.230 に答える
3

最大限の効率が必要な場合は、データベース名をキーとして辞書またはハッシュセットを作成すると思います。

var listOfFullPaths = new List<string>() 
{
    "C:\MyDir\SomeDir\SomeDatabase1.mdf",
    "C:\MyDir\SomeDir\SomeDatabase2.mdf",
    "C:\MyDir\SomeDir\SomeDatabase3.mdf"
}.ToDictionary(k => Path.GetFilenameWithoutExtension(k));

次に、listOfDBをループして、ハッシュを探すことができます

listOfDbs.Where(w => listOfFullPaths.Contains(w));

この場合、2つのループを実行し、辞書の組み込みの索引付けを利用します。

于 2012-05-11T17:53:04.743 に答える
2

両方のリストにデータが入力されていて、ディスク上のファイルにアクセスできない場合は、このlinqが役立ちます。

using System.Linq;

List<string> listOfFullPaths = new List<string>() 
{
    @"C:\MyDir\SomeDir\SomeDatabase1.mdf",
    @"C:\MyDir\SomeDir\SomeDatabase2.mdf",
    @"C:\MyDir\SomeDir\SomeDatabase3.mdf"
};

List<string> listOfDatabases = new List<string>() 
{
    "SomeDatabase1",
    "SomeDatabase2"
};

var dbs =  from path in listOfFullPaths
           from db in listOfDatabases
           where System.IO.Path.GetFileNameWithoutExtension(path) == db
           select path;
于 2012-05-11T17:50:41.253 に答える
1

速度の面で(つまり、O(n)で)効率的に実行したい場合は、JaredParの答えが正しいです。より慣用的なバージョンは次のとおりです。

var set = new HashSet<string>(listOfDbs);
List<string> result = listOfFullPaths
    .Where(p => set.Contains(Path.GetFileNameWithoutExtension(p)))
    .ToList();
于 2012-05-11T18:22:39.160 に答える