我有一个获取以下数据的sqlite查询:
private GetAllPlayerAttributesFromDB()
{
IDbCommand dbcmd = dbconn.CreateCommand();
string sqlQueryPlayer = "SELECT player_id, ability_id, value FROM playerabilities";
dbcmd.CommandText = sqlQueryPlayer;
IDataReader reader = dbcmd.ExecuteReader();
IDictionary<int, int> dict = new Dictionary<int, int>();
while (reader.Read())
{
int player_id = reader.GetInt32(0);
int ability_id = reader.GetInt32(1);
int value= reader.GetInt32(2);
// I have no idea how to save the data now
dict.Add(ability_id, value);
}
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
}
╔════════════╦════════════╦═══════╗
║ player_id ║ ability_id ║ value ║
╠════════════╬════════════╬═══════╣
║ "16" ║ "0" ║ "56" ║
║ "16" ║ "1" ║ "52" ║
║ "16" ║ "2" ║ "62" ║
║ "16" ║ "3" ║ "72" ║
║ "16" ║ "4" ║ "64" ║
║ "28" ║ "0" ║ "41" ║
║ "28" ║ "1" ║ "49" ║
║ "28" ║ "2" ║ "55" ║
║ "28" ║ "3" ║ "60" ║
║ "28" ║ "4" ║ "65" ║
║ "41" ║ "0" ║ "72" ║
║ "41" ║ "1" ║ "71" ║
║ "41" ║ "2" ║ "79" ║
║ "41" ║ "3" ║ "84" ║
║ "41" ║ "4" ║ "52" ║
╚════════════╩════════════╩═══════╝
我希望如何使用数据: 我想通过使用他的player_id作为关键来获得一个玩家的所有能力和价值。例如,如果我需要来自播放器16的数据,那么我想获得(0,56),(1,52),(2,62)...或者具有int []值= [56,52,每个球员都有62,72,64。
现在我想以高效的方式保存这些数据。在PHP中,我将使用关联数组。我怎么能在C#中做到这一点? (我已经阅读了一些关于字典的例子,但是我无法将它们用于我的问题。也许字典是错误的方法吗?)
答案 0 :(得分:2)
对于您已经拥有的代码,最简单的事情可能就是填充DataTable
这是一个内存中的表#34;。它有行和列。
IDataReader reader = dbcmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
更新
加载数据表后,您可以将数据转换为玩家实例(例如)。
鉴于这些课程:
class PlayerDetails
{
public string AbilityID { get; set; }
public string Value { get; set; }
}
class Player
{
public string PlayerID { get; set; }
public List<PlayerDetails> Details { get; set; }
}
您可以获得List<Player>
每个Details
属性,其中包含List<PlayerDetails>
:
var groupedByPlayer = dt.AsEnumerable().GroupBy(d => d["player_id"]).Select(b => new
Player
{
PlayerID = b.Key.ToString(),
Details = b.Select(bp => new PlayerDetails
{
AbilityID = bp[1].ToString(),
Value = bp[2].ToString()
}).ToList()
});
如果您不熟悉Linq,那可能看起来很丑陋,但是如果您了解SQL GROUP BY,那么除非您最终得到Player
类的实例。
答案 1 :(得分:1)
您需要定义一个数据结构来保存您的数据。
一个简单的就是一个代表一行
的类public class Player
{
public int Id {get; set;}
public int Ability {get;set;}
public int Value {get;set;}
}
并将每行添加到List<Player>
但是,每个玩家将有5行。
另一种选择是仅仅是能力/价值的类
public class AbilityValue
{
public int Ability {get;set;}
public int Value {get;set;}
}
并将其存储在Dictionary<int, List<AbilityValue>>
中。这需要一些解释:
使用方法:
如果您知道“Ability”始终在0到4之间,您还可以使用大小为5的数组作为字典的值。然后使用该功能作为该数组的索引来设置值。