如何使用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;
}
}
}
答案 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());