C# 筛选字符串并从中创建新字符串
我有一个日志,其中包含以下信息:C# 筛选字符串并从中创建新字符串,c#,string,winforms,C#,String,Winforms,我有一个日志,其中包含以下信息: Jane于2015年10月9日上午7:30打开了视频文件 鲍勃于2015年11月9日上午7:38打开了视频文件 Dave于2015年12月9日上午10:30打开了视频文件 我希望仅将此文本文件筛选到当前日期和已打开视频文件显示的用户,并创建一个新字符串,如下所示: Dave于2015年12月9日上午10:30打开了视频文件 然后,将其与用户列表进行比较,看看今天谁没有打开该文件,这样我就会得到通知,即Jane和Bob今天还没有打开该文件 以下是我尝试过的:
Jane于2015年10月9日上午7:30打开了视频文件
鲍勃于2015年11月9日上午7:38打开了视频文件
Dave于2015年12月9日上午10:30打开了视频文件
我希望仅将此文本文件筛选到当前日期和已打开视频
文件显示的用户,并创建一个新字符串,如下所示:
Dave于2015年12月9日上午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;
}
}
}
是否有人能够发现我的错误和/或向我解释正确的流程?您没有告诉我们您得到了什么,但是:
- 第7行中的情况明显相反
- 您没有对第9行中的
的结果进行任何操作ToArray()
完全没有意义(你希望得到什么?)users.ToString()
我建议您打开调试器,开始一步一步地查看您的程序在做什么。您没有告诉我们您得到了什么,但是:
- 第7行中的情况明显相反
- 您没有对第9行中的
的结果进行任何操作ToArray()
完全没有意义(你希望得到什么?)users.ToString()
我建议您打开调试器,开始一步一步地查看您的程序在做什么。问题是
.Contains
在数组而不是字符串上运行<数组上的code>.Contains将仅匹配整个数组元素
例如,logfile.Contains(“Dave在2015年12月9日上午10:30打开了视频文件”)
将为true,但logfile.Contains(“Dave”)
为false
您可以尝试以下方法(未经测试):
(完全支持,我必须快速地再次检查如何在另一个数组中查找此元素的子集)问题是
.Contains
在数组上运行,而不是在字符串上运行<数组上的code>.Contains将仅匹配整个数组元素
例如,logfile.Contains(“Dave在2015年12月9日上午10:30打开了视频文件”)
将为true,但logfile.Contains(“Dave”)
为false
您可以尝试以下方法(未经测试):
(完全支持,我必须快速仔细检查如何在另一个数组中查找此元素的子集)我注意到了一些事情
- 这个调用,
没有使用它的结果logfile.Where(val=>val!=currentdate).ToArray()
返回基于谓词的新序列,而不改变现有序列李>Where()
正在检查logfile.Contains(currentdate)
中的任何字符串是否等于logfile
字符串。根据您提供的格式,no是一个安全的答案。此currentdate
调用在日志文件数组上执行,而不是在每个字符串上执行。您可能需要Contains()
,它将检查是否有任何字符串包含logfile.Any(line=>line.Contains(currentdate))
字符串。这可能有点令人困惑-但请注意,在currentdate
上调用的行
是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));
我注意到了几件事
- 这个调用,
没有使用它的结果logfile.Where(val=>val!=currentdate).ToArray()
返回基于谓词的新序列,而不改变现有序列李>Where()
正在检查logfile.Contains(currentdate)
中的任何字符串是否等于logfile
字符串。根据您提供的格式,no是一个安全的答案。此currentdate
调用在日志文件数组上执行,而不是在每个字符串上执行。您可能需要Contains()
,它将检查是否有任何字符串包含logfile.Any(line=>line.Contains(currentdate))
字符串。这可能有点令人困惑-但请注意,在currentdate
上调用的行
是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));