c# 使用 LINQ,string.contains 字典键

c# using LINQ, string.contains dictionay key

如何使用 LINQ 表达式获取值: 我想从字典中获取值,其中键是文件名或字符串名中的“6VLX130T”(例如文件名是 E8502813B2-1PA_6VLX130T_XAPT2K3_100C_Indu_Class_20140408052219.stdf)

或者换句话说,我想检查字符串是否包含字典中的任何键,然后获取该键的值。

Dictionary<string, string> device = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
        device.Add("6VLX130T", "VIRTEX6");
        device.Add("6VLX140T", "VIRTEX6");
        device.Add("ZYNQ40", "ZYNQ");

foreach (string file in Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly))
        {
            if (file.IndexOf("_") > 0)
            {
                //E8502813B2-1PA_6VLX130T_XAPT2K3_100C_Indu_Class_20140408052219.stdf(this is file name)
                FileInfo fi = new FileInfo(file);
                string [] split = fi.Name.Split('_');
                foreach (string words in split)
                {
                    if(device.ContainsKey(words))
                    {
                        var valuee = device.FirstOrDefault(kvp => kvp.Key.Contains(words)).Value;

                    }
                }

            }

假设你的文件名中只有一个 'key',你可以这样写:

string value;
foreach (string words in split)
{
    if (device.TryGetValue(words, out value))
    {
        return value;
    }
}

如果你不想return,做一些其他有用的有价值的事情,很难通过问题准确地说出你需要做什么。

要专门使用 LINQ 表达式(我认为在这种情况下它不会提高可读性),您可以按照以下行进行操作:

var matchingKeyName = file.Split('_')
    .Where(s => device.ContainsKey(s)).SingleOrDefault();
if (matchingKeyName != null)
{
    string value = device[matchingKeyName];
    return value;
}
else
{
    // key name not found in file
}

这假定键名最多只包含在文件名中一次。如果文件中有多个键,则抛出异常。

如果你想把它发挥到极致并编写一行 lambda 表达式,那么你可以这样做,但我真的不认为 LINQ 是正确的方法,如下所示,因为代码无处可去接近容易理解。

var resultValue = devices.Single(x => x.Key == file.Split('_').Where(s => devices.ContainsKey(s)).SingleOrDefault());