【问题标题】:Where to add an if statement inside for foreach loop?在 foreach 循环中在哪里添加 if 语句?
【发布时间】:2016-05-13 11:46:22
【问题描述】:

我有一个这样的 CSV 文件:

1,01/01/2001,hello
2,19/09/2013,world
3,12/05/2016,world
4,13/05/2016,hello
5,12/12/2012,world
6,05/02/2006,world
7,06/03/2011,hello

我有这组code 来自我昨天问过的question

string parts = new StringReader(@"C:\input.txt").ReadToEnd();
string[] lines = parts.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
StringBuilder sb = new StringBuilder();
List<string> dates = new List<string>();

for (int i = 0; i < lines.Length; i++)
{
    string[] data = lines[i].Split(new string[] { "," }, StringSplitOptions.None);
    dates.Add(data[1]);
}

var datesSorted = dates.OrderBy(x => DateTime.ParseExact(x, "dd/MM/yyyy", null));

foreach (string s in datesSorted)
{
    sb.AppendLine(s + "<br />");
}

Label1.Text = sb.ToString();

上面的代码工作得很好,但现在我遇到了另一个问题。我想在代码中添加一个if 语句以仅显示所选值的日期,而我所能想到的就是这样做:

string parts = new StringReader(@"C:\input.txt").ReadToEnd();
string[] lines = parts.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
StringBuilder sb = new StringBuilder();
List<string> dates = new List<string>();

for (int i = 0; i < lines.Length; i++)
{
    string[] data = lines[i].Split(new string[] { "," }, StringSplitOptions.None);
    dates.Add(data[1]);
    var datesSorted = dates.OrderBy(x => DateTime.ParseExact(x, "dd/MM/yyyy", null));

    if (data[2] == "hello")
    {
        foreach (string s in datesSorted)
        {
            sb.AppendLine(s + "<br />");
        }

        Label1.Text = sb.ToString();
    }
}

或者将if 语句放在foreach 循环中,会产生相同的输出:

01/01/2001
01/01/2001
19/09/2013
12/05/2016
13/05/2016
01/01/2001
05/02/2006
06/03/2011
12/12/2012
19/09/2013
12/05/2016
13/05/2016

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    在我看来,您可以使用 LINQ 简化代码。

    试试这个:

    var lines = File.ReadAllLines(@"C:\input.txt");
    
    var query =
        from line in lines
        let data = line.Split(',')
        where data[2] == "hello"
        orderby DateTime.ParseExact(data[1], "dd/MM/yyyy", null)
        select data[1];
    
    var dates = query.ToList();
    
    Label1.Text = String.Join("", dates.Select(x => x + "<br />"));
    

    这将处理您想要的if 语句与query 中的where data[2] == "hello"

    【讨论】:

    • 这个真的很方便。我真的对LINQ一无所知。谢谢!
    【解决方案2】:

    您可能想要考虑做的事情之一是使用中间类来表示 csv 行,例如

    private class CSVEntry
    {
        public int EntryNo { get; set; }
        public DateTime Date { get; set; }
        public string Text { get; set; }
    }
    

    然后将您的数据加载更改为:

    List<CSVEntry> csvlist = new List<CSVEntry>();
    for (int i = 0; i < lines.Length; i++)
    {
        string[] data = lines[i].Split(new string[] { "," }, StringSplitOptions.None);
    
        csvlist.Add(new CSVEntry() { EntryNo = Int32.Parse(data[0]), Date = DateTime.ParseExact(data[1], "dd/MM/yyyy", null), Text = data[2] });
    }
    

    然后通过执行以下操作选择要显示的内容:

    var results = csvlist.Where(x => x.Text == "hello").OrderBy(x => x.Date);
    Label1.Text = String.Join("<br />", results.Select(x => x.Date.ToString("dd/MM/yyyy"));
    

    这样做的好处是您可以重新使用之前加载的内容,并且任何显示新值的更改都可以在 LINQ 投影中完成。

    编辑:

    我建议您将“加载”移到单独的函数中,例如

    public List<CSVEntry> LoadData(string filename, ... other params) {...
    

    然后是您要查找特定条目的部分

    public IEnumerable<CSVEntry> FindByName(List<CSVEntry> loadedData, ICollection<string> targetNames)
    {
         return loadedData.Where(x => targetNames.Contains(x.Text));
    }
    

    继续,您可以通过将数组/列表传递给函数来调用它

    var results = FindByName(csvList, new string[] { "hello", "world"});
    

    【讨论】:

    • 嗯。如果我在真实文件中没有 EntryNo,但我有一个唯一标识符的 string 怎么办?
    • 在这种情况下,您可以将public int EntryNo { get; set; } 更改为public string EntryId { get; set; },并从加载部分中删除Int32.Parse...
    • 我从csvlist.Add 行收到一个错误:'System.Collections.Generic.List.Add(string)' 的最佳重载方法有一些无效参数'。
    • 您是否将列表类型更改为List&lt;CSVEntry&gt; csvlist = new List&lt;CSVEntry&gt;();?它不应该是 List&lt;string&gt; 了。
    • 对不起,我没有注意到List 很糟糕。现在,它工作得很好!但是,如果我必须找到多个string 来显示怎么办?例如,在我的 CSV 示例中,有 helloworld,但还有更多内容。那么,我现在该如何提取呢?
    猜你喜欢
    • 2014-02-13
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多