在参考了很多博客和文章之后,我已经达到了以下代码,用于在文件夹内的所有文件中搜索字符串.它在我的测试中运行良好.
质询
注意:我测试了非常小的文件.文件数量也很少.
码
static void Main()
{
string sourceFolder = @"C:\Test";
string searchWord = ".class1";
List<string> allFiles = new List<string>();
AddFileNamesToList(sourceFolder, allFiles);
foreach (string fileName in allFiles)
{
string contents = File.ReadAllText(fileName);
if (contents.Contains(searchWord))
{
Console.WriteLine(fileName);
}
}
Console.WriteLine(" ");
System.Console.ReadKey();
}
public static void AddFileNamesToList(string sourceDir, List<string> allFiles)
{
string[] fileEntries = Directory.GetFiles(sourceDir);
foreach (string fileName in fileEntries)
{
allFiles.Add(fileName);
}
//Recursion
string[] subdirectoryEntries = Directory.GetDirectories(sourceDir);
foreach (string item in subdirectoryEntries)
{
// Avoid "reparse points" …Run Code Online (Sandbox Code Playgroud) 我有一个名为ICatalog如下所示的接口,其中每个接口ICatalog都有一个名称和一个基于Predicate<Item>函数返回项目的方法.
public interface ICatalog
{
string Name { get; }
IEnumerable<Item> GetItems(Predicate<Item> predicate);
}
Run Code Online (Sandbox Code Playgroud)
目录的特定实现可以链接到各种格式的目录,例如XML或SQL数据库.
使用XML目录,我最终将整个XML文件反序列化为内存,因此使用谓词函数测试每个项目并不会增加更多的开销,因为它已经在内存中.
然而,在SQL实现中,我宁愿不将数据库的全部内容检索到内存中,然后使用谓词函数过滤项目.相反,我想找到一种方法以某种方式将谓词传递给SQL服务器,或以某种方式将其转换为SQL查询.
这似乎是一个可以用Linq解决的问题,但我对它很陌生.我的界面应该返回IQueryable吗?我现在不关心如何实际实现我的ICatalog的SQL版本.我只是想确保我的界面将来允许它.
我想根据谓词拆分一个字符串.举个例子:
"ImageSizeTest"应该成为"图像大小测试"
注意:Uppercased字符是谓词
当然,我可以编写一个简单的循环,遍历字符串,检查大写字符(谓词)并构建新字符串.但是我希望这更加通用,基于任何谓词进行拆分.仍然不是很难实现,但我想知道是否有一种优雅的方式来使用它Linq.
参考:
说我有一个IEnumerable.例如,{2,1,42,0,9,6,5,3,8}.
我需要获得与谓词匹配的项目的"运行".例如,如果我的谓词是
bool isSmallerThanSix(int number){...}
Run Code Online (Sandbox Code Playgroud)
我想获得以下输出:{{2,1},{0},{5,3}}
是否有内置功能可以实现这一目标?
到目前为止我有这个:
public static IEnumerable<IEnumerable<T>> GetSequences<T>(this IEnumerable<T> source,
Func<T, bool> selector) {
if (source == null || selector == null) {
yield break;
}
IEnumerable<T> rest = source.SkipWhile(obj => !selector(obj));
while (rest.Count() > 0) {
yield return rest.TakeWhile(obj => selector(obj));
rest = rest
.SkipWhile(obj => selector(obj))
.SkipWhile(obj => !selector(obj));
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来很有效,但是我是在半夜写的,因此从星期二开始就效率低十五.是否有更好的,最好是内置(因此经过良好测试)的方式?
非常感谢你们的时间,
利雅.