Linq查询,从一个列表属性中选择所有内容,该属性以另一个列表中的字符串开头

时间:2014-07-25 10:17:40

标签: c# linq list lambda

您好我是linq和lambda的新手

我有两个列表

fl.LocalOpenFiles ...
List<string> f....

有一个属性(字符串),例如取索引0

fl.LocalOpenFiles[0].Path

我想从第一个列表fl.LocalOpenFiles中选择所有fl.LocalOpenFiles.Path,其中List<string> fList<LocalOpenFile> lof = new List<LocalOpenFile>(); lof = fl.LocalOpenFiles.Join( folders, first => first.Path, second => second, (first, second) => first) .ToList();

中的字符串开头

我终于得到了这个......

first.Path == second

但它只是选择符合要求f[<any>] == fl.LocalOpenFiles[<any>].Path.Substring(0, f[<any>].Length) 的文件夹而我无法找到一种方法来获取我想要的数据,这符合这个“braindump”要求:

List<string> f = new List<string>{ "abc", "def" };
List<LocalOpenFile> lof = new List<LocalOpenFile>{ 
    new LocalOpenFile("abc"),
    new LocalOpenFile("abcc"),
    new LocalOpenFile("abdd"),
    new LocalOpenFile("defxsldf"),)}

    // Result should be
    // abc
    // abcc
    // defxsldf

另一个例子......

{{1}}

我希望我以一种可以理解的方式解释它:) 谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

你的意思是这样的:

List<LocalOpenFile> result = 
        lof.Where(file => f.Any(prefix => file.Path.StartsWith(prefix)))
           .ToList();

答案 1 :(得分:0)

您可以使用常规where代替联接,这样可以更直接地控制选择标准;

var result = 
    from file in lof
    from prefix in f
    where file.Path.StartsWith(prefix)
    select file.Path;   // ...or just file if you want the LocalOpenFile objects

请注意,匹配多个前缀的文件可能会出现多次。如果这是一个问题,您只需添加对Distinct的调用即可消除重复项。

编辑:
如果你 - 在这种情况下似乎 - 只想知道匹配的路径而不是它匹配的前缀(即你只想要一个集合中的数据,就像这种情况一样),我会去@ har07&#39;而是Any解决方案。