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

时间:2015-02-11 08:13:04

标签: c# linq

如何使用LINQ表达式获取值: 我想从Dictionary获得值,其中key是" 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;

                    }
                }

            }

1 个答案:

答案 0 :(得分:0)

假设你只有一把钥匙&#39;在你的文件名中,你可以写:

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

如果您不想返回,请执行其他有用的功能,很难准确说明问题需要做什么。

要专门使用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());