如何使用 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);
}
真诚地,
您可以尝试使用库,这样可以轻松地将 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
。如果你想获取一个唯一命名的对象,你应该使用Single
或SingleOrDefault
,例如
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;
?