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