C# 如何在csv文件中获取匹配值?
所以我有一个.csv文件,有两列,看起来有点像这样:C# 如何在csv文件中获取匹配值?,c#,csv,C#,Csv,所以我有一个.csv文件,有两列,看起来有点像这样: 01,23 02,45 03178 等等 现在我想读取csv文件,为第一列指定一个值,然后从第二列返回相应的值。(假设我给它一个值03,它应该给我178) 这是我到目前为止得到的代码,但是if语句中应该包含什么 public int CalculateNextLevel(int current_xp, int current_lvl) { var reader = new StreamReader(File.OpenR
01,23
02,45
03178
等等 现在我想读取csv文件,为第一列指定一个值,然后从第二列返回相应的值。(假设我给它一个值03,它应该给我178)
这是我到目前为止得到的代码,但是if语句中应该包含什么
public int CalculateNextLevel(int current_xp, int current_lvl)
{
var reader = new StreamReader(File.OpenRead(@"C:\Users\Lennart\Desktop\Legends of Raymere\Files\Lvl.csv"));
List<int> levels = new List<int>();
List<int> exp = new List<int>();
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
levels.Add(Convert.ToInt32(values[0]));
exp.Add(Convert.ToInt32(values[1]));
foreach (int level in levels)
{
if (current_lvl == level)
{
}
}
}
return XP_to_nxt_lvl;
}
public int CalculateNextLevel(int current\u xp,int current\u lvl)
{
var reader=new StreamReader(File.OpenRead(@“C:\Users\Lennart\Desktop\Legends of Raymere\Files\Lvl.csv”);
列表级别=新列表();
List exp=新列表();
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var值=行分割(',');
levels.Add(转换为32(值[0]);
exp.Add(转换为32(值[1]);
foreach(以级别为单位的整数级别)
{
如果(当前水平==水平)
{
}
}
}
将XP_返回到_nxt_lvl;
}
您应该像这样使用Linq:
foreach (int level in levels)
{
if (current_lvl == level)
{
XP_to_nxt_lvl = exp[levels.IndexOf(level)];
}
}
您可以使用
字典
var expValues = new Dictionary<int, int>();
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
expValues.Add(Convert.ToInt32(values[0]), Convert.ToInt32(values[1]));
}
// Retrieve value based on level
if (expValues.ContainsKey(3))
{
int level03Exp = expValues[3];
}
var expValues=new Dictionary();
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var值=行分割(',');
Add(Convert.ToInt32(值[0]),Convert.ToInt32(值[1]);
}
//基于级别检索值
if(expValues.ContainsKey(3))
{
int level03Exp=expValues[3];
}
试试这个
static void Main(string[] args)
{
string key = "03";
GetValue(key);
}
private static int GetValue(string key)
{
var lines = File.ReadAllLines("test.txt");
var dictonary = lines.ToDictionary(dict =>
{
return dict.Split(',')[0];
});
int valInt = int.Parse(dictonary[key].Split(',')[1]);
return valInt;
}
您可以使用
LINQ
和一个允许重复键但类似于字典的。如果密钥(级别)不存在,则会得到xp的空集合:
private ILookup<int, int> LevelLookup = null;
public void LoadAllLevels()
{
LevelLookup = File.ReadLines(@"C:\Temp\Lvl.csv")
.Select(l => l.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
.Select(cols =>
{
int level = 0, xp = 0;
bool validLine = cols.Length == 2;
if(validLine)
validLine = int.TryParse(cols[0].Trim(), out level);
if(validLine)
validLine = int.TryParse(cols[1].Trim(), out xp);
return new{ level, xp, validLine };
})
.Where(x => x.validLine)
.ToLookup(x => x.level, x => x.xp);
}
public int? CalculateNextLevel(int current_xp, int current_lvl)
{
int? nextLevel = null;
var xps = LevelLookup[current_lvl];
if (xps.Any())
nextLevel = xps.First();
return nextLevel;
}
我使用了nullables来区分XP=0和尚未定义XP的级别
bool hasLev4XP = xp4.HasValue;
if(hasLev4XP)
{
int lev4XpNeeded = xp4.Value;
}
如果级别保证是唯一的,那么您也可以使用ToDictionary
创建一个字典,并使用与上面类似的代码。第一列是唯一的还是可能重复?dictionary?@TimSchmelter它看起来像RPG-level/XP,因此它们实际上是唯一的,在这种情况下,只需使用一个数组,因为它们是连续的,没有漏洞
bool hasLev4XP = xp4.HasValue;
if(hasLev4XP)
{
int lev4XpNeeded = xp4.Value;
}