C# 如何在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

所以我有一个.csv文件,有两列,看起来有点像这样:
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;
}