C# 如何使用LINQ在csv文件中查找对象

C# 如何使用LINQ在csv文件中查找对象,c#,.net,linq,object,csv,C#,.net,Linq,Object,Csv,Hy 我有一个这样的csv文件 user\u name1,c:\photo\user\u photo.jpg,0,0,0 其中每一行都引用一个不同的对象,其自身的文件与逗号分隔 如何找到知道用户名的特定对象?我使用不同的用户名。在那之后,我如何制造那个物体,我现在使用的物体 我到目前为止所做的: StreamReader sc = new StreamReader(@"C:\Player.csv"); String linie = sc.ReadLine(); while (!String.Is

Hy

我有一个这样的csv文件

user\u name1,c:\photo\user\u photo.jpg,0,0,0

其中每一行都引用一个不同的对象,其自身的文件与逗号分隔

如何找到知道用户名的特定对象?我使用不同的用户名。在那之后,我如何制造那个物体,我现在使用的物体

我到目前为止所做的:

StreamReader sc = new StreamReader(@"C:\Player.csv");
String linie = sc.ReadLine();
while (!String.IsNullOrEmpty(linie))
{
    string[] stringu = linie.Split(',');
    Player player = new Player(stringu[0], stringu[1], int.Parse(stringu[2]), int.Parse(stringu[3]), int.Parse(stringu[4]));
    players.Add(player);
    linie = sc.ReadLine();
}
sc.Close();
var query = players.Where(a => a.Name == label6.Text);
}

因此,

您可以尝试使用一个库,它使CSV文件与LINQ查询的使用变得简单。请看。

你试过类似的东西吗

Player selected_player = from pl in players
                         where pl.Name == label6.Text
                         select pl;

首先,我建议解析CSV文件时不要使用自己的字段拆分器。我建议使用类似TextFieldParser的东西,它可以通过引用Microsoft.VisualBasic在C中使用

创建解析器后,可以使用它获取应用程序中由行表示的每条记录的字符串数组:

List<Players> players = new List<Players>();

var parser = new TextFieldParser();

while ( !parser.EOF )
{
   string [] playerFields = parser.ReadFields();

   // Create player from fields
   var player = Player.FromFields(playerFields);

   players.Add(player);
}

无论如何,我只是想一想。

目前唯一的问题是,据我所知,你说你想获取一个特定的对象,但在你的最后一行中,你使用Where,它将返回一个包含一个、一个或多个这样的对象的IEnumerable。如果要获取一个唯一命名的对象,应使用Single或SingleOrDefault,例如

您接受的答案只是将您的查询从转换为等效查询,并通过尝试将结果IEnumerable转换为播放机引入编译错误

预计可能会出现问题,您可能还想研究一下,您需要添加对Microsoft.VisualBasic.dll的引用,这将允许您以更稳健的方式解析CSV,即使用以下类似方式处理包含逗号等的字段:

using (var parser = new TextFieldParser(filename))
{
    parser.SetDelimiters(",");
    while (!parser.EndOfData)
    {
        var p = parser.ReadFields();
        players.Add(new Player(p[0], p[1], int.Parse(p[2]), int.Parse(p[3]), int.Parse(p[4])));
    }
}

发布的代码有什么问题?除了您不在字段中处理逗号之外,您还试图做哪些代码不处理的事情?您在源代码中混合了各种语言?啊。你正在代码中使用LINQ。因为您接受了一个关于LINQ的查询语法的答案,而不是您正在使用的LINQ的方法语法,所以您应该意识到这两种语法编译为相同的IL。请参阅这篇关于LINQ的查询和方法语法的MSDN文章:这与OP当前所做的没有什么不同。查询和方法语法编译为相同的thing.Yep。我不清楚他要什么。。。不管怎样,他正在准备这个问题,但没有使用它,对吗?但是你的回答没有帮助。我不这么认为。他想得到那个东西,我正在得到。但无论如何,请投我一票:我以前用过那个图书馆,它很不错。请注意,它会影响性能和内存使用,因此对于大型文件来说并不理想。如果您的目标是RAD,并且没有大文件或大性能要求,那么它是完成这项工作的最佳工具。@TheSoftwareEdi感谢您与我们分享此信息。我还没有在这个库中对大文件进行测试。所以我以前从未经历过这种情况。谢谢你Christos Paisios:-我在一家大型广告公司工作,经常遇到1-100GB的文件。如果我记得的话,这个库希望将整个文件加载到内存中,或者将已经读取的行保留在内存中,而不是使用游标样式的设计。再说一次,它擅长于它所做的事情,我并不想表明它不是这样做的!如果合适的话,我会再用一次。幸运的是,我目前没有CSV土地。@TheSoftwareEdi听起来很棒-你没有CSV土地。这不是一个很快乐的地方。谢谢你的详细解释。
var myPlayer = players.Single(x => x.Name == label6.Text);
using (var parser = new TextFieldParser(filename))
{
    parser.SetDelimiters(",");
    while (!parser.EndOfData)
    {
        var p = parser.ReadFields();
        players.Add(new Player(p[0], p[1], int.Parse(p[2]), int.Parse(p[3]), int.Parse(p[4])));
    }
}