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

本文关键字:查找 对象 文件 csv 何使用 LINQ | 更新日期: 2023-09-27 17:56:43

>Hy,

我有一个这样的csv文件

user_name1,c:''photo''user_photo.jpg,0,0,0,0

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

如何找到知道用户名的特定对象?我使用不同的user_names。在那之后,我如何使那个对象,我使用的当前对象?

到目前为止,我所做的:

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);
}

真诚地,

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

您可以尝试使用库,这样可以轻松地将 CSV 文件与 LINQ 查询一起使用。请看这里。

首先,我建议在解析 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);
}

现在,这实际上取决于您是否要连续查询文件中的播放器,就像您这样做一样,那么获取内存中副本并使用 LINQ 是有意义的,否则如果您只想查询一次,那么我只需逐行进行检查。

假设您确实想要多次查询,那么解析文件并将值保存在 List 或类似内容中是有意义的(假设文件不是大得离谱)。

最后,如果您有不同的用户名,则可以使用 LINQ 中的 FirstOrDefault 方法为您提供匹配的单个播放器。

VAR 播放器 = 玩家。FirstOrDefault(p => p.Name.Equals(textBox.Text));

或者,如果你知道你有唯一的玩家名字,你可以把整个批次存储在字典中......?

if ( players.ContainsKey(textBox.Text) )
{
  var player = players[textBox.Text];
}

无论如何,只是一些想法。

据我所知,您目前遇到的唯一问题是,您说您要获取"特定对象",但是在最后一行中,您将使用Where它将返回一个包含一个,没有或许多此类对象的IEnumerable。如果你想获取一个唯一命名的对象,你应该使用SingleSingleOrDefault,例如

var myPlayer = players.Single(x => x.Name == label6.Text);

您接受的答案只是将您的查询从方法语法转换为等效的查询语法,并通过尝试将生成的IEnumerable<Player>转换为Player来引入编译错误。

在预料到您可能即将遇到的问题时,您可能还需要查看Microsoft.VisualBasic.FileIO.TextFieldParser(您需要添加对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])));
    }
}

你有没有尝试过类似的东西

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