使用foreach仅显示列表中的某些元素

时间:2018-11-20 14:39:56

标签: c#

我对C#还是很陌生,我一直在尝试在线搜索答案/解决方案,但是不能。

基本上,我已经用C#读取了一个csv文件,用逗号(',')分隔行,并将三组数据存储在一个表中。例如,csv文件的一行类似于:name,date1,date2

您可以看到以下代码(还创建了RHM类):

List<RHM> data1 = new List<RHM>();

List<string> lines = File.ReadAllLines(filePath).ToList();
lines.RemoveAt(0);
foreach (var line in lines)
{
    string[] entries = line.Split(',');
    RHM nRHM = new RMH 
    {
        Name = entries[0],
        Date1 = entries[1],
        Date2 = entries[2]
    };

    data1.Add(nRMH);

}

现在我已成功导入它,我只想显示例如名称列表中的第5行。到目前为止,我只能使用foreach循环来显示所有名称:

foreach (var RMH in data1)
{
    Console.WriteLine(RMH.Name);
}

我尝试使用.skip,但这只会从列表中删除一个元素。我需要一种方法来显示第23、34、15行。

2 个答案:

答案 0 :(得分:2)

您可以按索引访问列表中的对象。因此,如果要使用第23个元素,则只需执行list[22]。索引基于0,这意味着list[0]将成为列表中的第一个元素。这是一个如何访问和使用列表中对象的示例:

RHM 23rdItemInList = data1[22];
Console.WriteLine($"Name of item in list on index 22 is: {23rdItemInList.Name}");

请注意,如果您从列表中删除一项,则索引将与文件中的实际行不对应。如果有问题,我建议将行号存储在您的对象中。

List<RHM> data1 = new List<RHM>();

List<string> lines = File.ReadAllLines(filePath).ToList();
lines.RemoveAt(0);
int lineNumber = 1; //Here probably should be 2 because you skipping the first line in file with lines.RemoveAt(0);
foreach (var line in lines)
{
    string[] entries = line.Split(',');
    RHM nRHM = new RMH 
    {
        Line = lineNumber,
        Name = entries[0],
        Date1 = entries[1],
        Date2 = entries[2]
    };

    data1.Add(nRMH);
    lineNumber++;
}

现在,您可以像这样通过行号获取对象:

var 23rdLineData = data1.FirstOrDefault(x=>x.Line == 23);
如果列表中没有Line == 23的记录,则

FirstOrDefault将返回null对象。 使用前检查是否找到了物体

if(23rdLineData != null)
   Console.WriteLine($"Name on line 23 is {23rdLineData.Name}");
else
   Console.WriteLine("There is no data on line 23");

答案 1 :(得分:0)

有多种方法可以实现目标。

例如,您可以使用LINQ通过任何对象字段过滤列表,如下所示:

RMH niceRMH;
int index = 23;
data1.TryGetValue(index, out niceRMH);

要按行号过滤,可以使用TryGetValue例如:

cmd /c rmdir...
相关问题