Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 筛选字符串并从中创建新字符串_C#_String_Winforms - Fatal编程技术网

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
    中的任何字符串是否等于
    currentdate
    字符串。根据您提供的格式,no是一个安全的答案。此
    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
    中的任何字符串是否等于
    currentdate
    字符串。根据您提供的格式,no是一个安全的答案。此
    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));