我有一个日志,其中包含如下信息:
Jane 在 9/10/2015 早上 7:30 打开了视频文件
Bob 在 2015 年 9 月 11 日早上 7:38 打开视频文件
Dave 在 9/12/2015 上午 10:30 打开了视频文件
我希望将此文本文件过滤为仅显示当前日期和打开 video
文件显示的用户,并创建一个新字符串,如下所示:
Dave 在 9/12/2015 上午 10:30 打开了视频文件
然后,将其与用户列表进行比较,看看谁今天没有打开文件,这样我就会收到 Jane
和 Bob
没有打开的通知今天打开文件。
这是我尝试过的:
private void refreshbtn_Click(object sender, EventArgs e)
{
string currentdate = DateTime.Now.ToShortDateString();
string[] logfile = File.ReadAllLines(@"C:\log.txt");
string[] users = {"Jane", "Bob", "Dave"};
if (!logfile.Contains(currentdate))
{
logfile.Where(val => val != currentdate).ToArray();
if (logfile.Contains(users.ToString()))
{
string x = users.ToString();
richTextBox1.Text = x;
}
}
}
是否有人能够发现我哪里出错了和/或向我解释正确的流程是什么?
最佳答案
我注意到几件事。
- 此调用
logfile.Where(val => val != currentdate).ToArray()
没有使用它的结果。Where()
返回基于谓词的新序列,而不是改变现有序列。 logfile.Contains(currentdate)
正在检查logfile
中的任何字符串是否等于currentdate
字符串。根据您提供的格式,“否”是一个安全的答案。此Contains()
调用对日志文件数组进行操作,而不是对每个字符串进行操作。您可能需要logfile.Any(line => line.Contains(currentdate))
,它将检查是否有任何字符串包含currentdate
字符串。这可能有点令人困惑 - 但请注意line
上调用的Contains()
是string.Contains()
方法,而不是可枚举
扩展方法。
这是一个您可以根据自己的程序进行改编的片段,
var currentDate = DateTime.Now.ToShortDateString();
var logFile = File.ReadAllLines(@"log.txt");
var users = new [] { "Jane", "Bob", "Dave" };
var viewers = from line in logFile
where line.Contains(currentDate)
select users.First(user => line.Contains(user));
var transgressers = users.Except(viewers);
foreach (var user in transgressers)
{
Console.WriteLine(user);
}
如果这是一次性的情况,这可能很好,但如果您有此日志文件的其他用户,我建议将条目解析为对象,以便您可以编写更有意义的代码.
给定这两种类型:
class User
{
public string Name { get; }
}
class UserView
{
public User Viewer { get; }
public DateTime ViewTime {get; }
}
和每个的 IEnumerable,您可以将其缩短为:
var nonViews = users.Except(
views.Where(v => v.ViewTime.Date == DateTime.Today)
.Select(v => v.Viewer));
关于c# - 过滤字符串并从中创建新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32545211/