凡里面添加一个if语句foreach循环? [英] Where to add an if statement inside for foreach loop?
问题描述
我有一个CSV文件是这样的:
1,01 / 01/2001,你好
2,19 / 09/2013,世界
3,12 / 05/2016,世界
4,13 / 05/2016,你好
5,12 / 12/2012年,世界
6,05 / 02/2006,世界
7.06 / 03/2011,你好
我从<一个这套 code 的href=\"http://stackoverflow.com/questions/37185038/linq-unable-to-orderby-date-in-specific-column\">question我昨天问:
串件=新StringReader(@C:\\ input.txt中)为ReadToEnd();
字符串[] =行parts.Split(新的String [] {} Environment.NewLine,StringSplitOptions.None);
StringBuilder的SB =新的StringBuilder();
清单&LT;串GT;日期=新的List&LT;串GT;();的for(int i = 0; I&LT; lines.Length;我++)
{
字符串[] =数据线[I] .Split(新的String [] {,},StringSplitOptions.None);
dates.Add(数据[1]);
}VAR datesSorted = dates.OrderBy(X =&GT; DateTime.ParseExact(X,DD / MM / YYYY,NULL));的foreach(在datesSorted字符串s)
{
sb.AppendLine(S +&LT; BR /&gt;中);
}Label1.Text = sb.ToString();
以上code工作得很好,但现在我有另一个问题。我想在code中添加一个如果
语句只显示所选择的值的日期和所有我能想到的是做任何这样的事情:
串件=新StringReader(@C:\\ input.txt中)为ReadToEnd();
字符串[] =行parts.Split(新的String [] {} Environment.NewLine,StringSplitOptions.None);
StringBuilder的SB =新的StringBuilder();
清单&LT;串GT;日期=新的List&LT;串GT;();的for(int i = 0; I&LT; lines.Length;我++)
{
字符串[] =数据线[I] .Split(新的String [] {,},StringSplitOptions.None);
dates.Add(数据[1]);
VAR datesSorted = dates.OrderBy(X =&GT; DateTime.ParseExact(X,DD / MM / YYYY,NULL)); 如果(数据[2] ==你好)
{
的foreach(在datesSorted字符串s)
{
sb.AppendLine(S +&LT; BR /&gt;中);
} Label1.Text = sb.ToString();
}
}
或将的foreach
循环中的如果
语句,这会导致相同的输出:
01/01/2001
01/01/2001
19/09/2013
2016年12月5日
13/05/2016
01/01/2001
2006年5月2日
06/03/2011
2012年12月12日
19/09/2013
2016年12月5日
13/05/2016
一个你可能要考虑这样做,而不是事情是使用一个中间类来重新present一个CSV行,例如
私有类CSVEntry
{
公众诠释EntryNo {搞定;组; }
公众的DateTime日期{搞定;组; }
公共字符串文本{搞定;组; }
}
然后改变你的数据加载到:
列表&LT; CSVEntry&GT; csvlist =新的List&LT; CSVEntry&GT;();
的for(int i = 0; I&LT; lines.Length;我++)
{
字符串[] =数据线[I] .Split(新的String [] {,},StringSplitOptions.None); csvlist.Add(新CSVEntry(){EntryNo = Int32.Parse(数据[0]),日期= DateTime.ParseExact(数据[1],DD / MM / YYYY,NULL),文本=数据[2]} );
}
然后选择通过做这样的事情要显示的内容:
VAR的结果= csvlist.Where(X =&GT; x.Text ==你好)排序依据(X =&GT; x.Date);
Label1.Text =的string.join(&LT; BR /&gt;中,results.Select(X =&GT; x.Date.ToString(DD / MM / YYYY));
要这样做的好处是,你可以重新使用您在$ P $装什么pviously,任何更改,以显示新的值可以在LINQ投影来完成。
编辑:
我建议你移动加载到一个单独的功能,例如
公开名单&LT; CSVEntry&GT; LoadData(字符串文件名,...等PARAMS){...
,然后要找到特定条目的一部分
公开的IEnumerable&LT; CSVEntry&GT; FindByName(列表&LT; CSVEntry&GT; loadedData,ICollection的&LT;串GT; targetNames)
{
返回loadedData.Where(X =&GT; targetNames.Contains(x.Text));
}
继续,你可以通过传递一个数组/列表功能调用它
VAR的结果= FindByName(csvList,新的String [] {你好,世界});
I have a CSV file like this:
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
I have this set of code from a question I asked yesterday:
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();
The above code works just fine but now I have another problem. I want to add an if
statement within the code to only display the chosen value's date and all I could think of is doing either something like this:
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();
}
}
Or placing the if
statement within the foreach
loop, which results in the same output:
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
One of the things you may want to consider doing instead is to use an intermediate class to represent a csv line, e.g.
private class CSVEntry
{
public int EntryNo { get; set; }
public DateTime Date { get; set; }
public string Text { get; set; }
}
And then change your data loading to:
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] });
}
Then chose what to display by doing something like:
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"));
The benefit to doing it this way is that you can re use what you have loaded in previously, and any changes to display new values can be done in a LINQ projection.
Edit:
I suggest you move the 'loading' into a separate function, e.g.
public List<CSVEntry> LoadData(string filename, ... other params) {...
and then the part where you want to find specific entries
public IEnumerable<CSVEntry> FindByName(List<CSVEntry> loadedData, ICollection<string> targetNames)
{
return loadedData.Where(x => targetNames.Contains(x.Text));
}
Moving on, you can call it by passing an array/list to the function
var results = FindByName(csvList, new string[] { "hello", "world"});
这篇关于凡里面添加一个if语句foreach循环?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!