1

我有两个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));

然后您可以遍历 listOfDBs 并查找哈希

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

在这种情况下,您执行两个循环并利用字典的内置索引。

于 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 回答