c# - 过滤字符串并从中创建新的

标签 c# string winforms

我有一个日志,其中包含如下信息:

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 打开了视频文件

然后,将其与用户列表进行比较,看看谁今天没有打开文件,这样我就会收到 JaneBob 没有打开的通知今天打开文件。

这是我尝试过的:

    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/

相关文章:

c# - 如何保存datagridview的排序阶段通知c#

c# - ListBox 的 SelectionChanged 事件第二次不起作用

c# - 如何显示AudioMeterInformation?

swift - 如何在 Swift 中的英镑符号字符串中应用空格?

c - 使用strtok将字符串划分为C中的数组

带有多个嵌入图像的 VB.NET 电子邮件

c# - 如何在 vb.net 或 C# 中向菜单条分隔符添加信息文本

c# - 在位图图像中设置背景颜色

c# - Restful wcf 服务返回 json 中的数据行 - android 客户端

带有语言环境的 Javascript string.prototype.contains()