C# 如果是逗号分隔键,则无法在字典中按键查找值
我有一个像下面这样的字典,其中我存储了文件名列表,根据文件数量生成的键为Csv1、Csv2 我有一个字符串数组,如下所示:C# 如果是逗号分隔键,则无法在字典中按键查找值,c#,.net,C#,.net,我有一个像下面这样的字典,其中我存储了文件名列表,根据文件数量生成的键为Csv1、Csv2 我有一个字符串数组,如下所示: string[] files = { "SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv", "SampleCSVFile_5300kb3.csv"}; int counter=1; var dictionary = new Dictionary<string, string>(); foreach (
string[] files = { "SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv", "SampleCSVFile_5300kb3.csv"};
int counter=1;
var dictionary = new Dictionary<string, string>();
foreach (var file in files)
{
dictionary.Add("CSV" + counter, file);
counter++;
}
foreach (var file in files)
{
string myValue;
if (dictionary.TryGetValue(file, out myValue)) // getting null in out value
}
TryGetValue中的第一个参数是键。因此,您应该通过CSV+计数器使其工作
您正在使用以下键向词典中添加项: CSV+计数器->CSV1,CSV2 您尝试在此处查找不同的值,例如SampleCSVFile_5300kb1.csv、SampleCSVFile_5300kb2.csv:
请尝试以下更新的代码:
string[] files = { "SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv", "SampleCSVFile_5300kb3.csv" };
int counter = 1;
var dictionary = new Dictionary<string, string>();
foreach (var file in files)
{
dictionary.Add("CSV" + counter, file);
counter++;
}
counter = 1;
foreach (var file in files)
{
string myValue;
//You need to pass key name here but you are passing value of it
//Need to update here
string keyName = "CSV" + counter;
if (dictionary.TryGetValue(keyName, out myValue)) ; // getting null in out value
counter++;
}
迭代字典,并使用逗号拆分查找所需的值。将SampleCSVFile_5300kb1.csv和SampleCSVFile_5300kb2.csv放入同一myvalKey的文件名数组中
据我所知,你似乎在寻找一种只匹配部分钥匙的方法。虽然我建议使用的答案,只需分别添加具有相同值的部分密钥,但无论如何,我将为您提供一种使用Linq匹配部分密钥的方法
string resultValue = null;
string resultKey = dictionary.Keys.FirstOrDefault(k => k.Contains(file));
if(resultKey != null)
resultValue = dictionary[resultKey];
如果希望所有匹配的键都用Where替换FirstOrDefault,则假定只需要第一个匹配项
请注意,虽然这段代码很简单,但它不适用于性能非常关键的情况,因为您基本上是使用字典作为工具来迭代键的
List<Tuple<string,string>>
根据你在Amir Popoviches回答中的评论。我认为你应该改变你的词典结构 因此,您将创建从每个.csv文件到CSV1 etc字符串的映射
var files = new[] { "SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv", "SampleCSVFile_5300kb3.csv" };
var counter = 1;
var dictionary = new Dictionary<string, string>();
foreach (var file in files)
{
if (string.IsNullOrWhiteSpace(file))
{
continue;
}
foreach (var item in file.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries))
{
dictionary.Add(item, "CSV" + counter);
}
counter++;
}
这应该会输出给您
SampleCSVFile_5300kb1.csv -> CSV1
SampleCSVFile_5300kb2.csv -> CSV1
SampleCSVFile_5300kb3.csv -> CSV2
如果要按值查找entires,则需要手动迭代字典是否为SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv应该放在一起还是分开?@hasnayn:它们应该在一起我正在试图找到SampleCSVFile_5300kb1.csv的值,并基于此我想要得到CSV1等。所以你需要这样插入项:dictionary.Addfile,csv+counter;是的,我更改了它,但在第一个记录值的情况下,我仍然无法找到SampleCSVFile_5300kb1.csv,即SampleCSVFile_5300kb1.csv将数组从{SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv,SampleCSVFile_5300kb3.csv}更改为{SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv,SampleCSVFile_5300kb3.csv}@Learning-BTW,您可以创建一行代码:var dictionary=files.Selectk,i=>new{Index=i+1,Keys=k.Split',}.SelectManyi=>i.Keys.Selectk=>new{Index=i.Index,Key=k}.ToDictionaryi=>i.Key,i=>CSV+i.Index;抱歉,我有一个问题,TryGetValue函数与精确值匹配,或者类似于包含函数??它将使用键在字典中搜索值,并返回true/false,这取决于是否找到值,并且out参数由值填充,因此可以在调用代码中使用它。因此,它不仅仅包含函数。编辑为时已晚。它比ContainsKey函数做得更多。但是,它不会在密钥中执行包含搜索,如果您希望部分匹配,则必须手动执行。是的,这很有效。非常感谢您的帮助,请继续这样帮助。再次感谢
List<Tuple<string,string>>
var files = new[] { "SampleCSVFile_5300kb1.csv,SampleCSVFile_5300kb2.csv", "SampleCSVFile_5300kb3.csv" };
var counter = 1;
var dictionary = new Dictionary<string, string>();
foreach (var file in files)
{
if (string.IsNullOrWhiteSpace(file))
{
continue;
}
foreach (var item in file.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries))
{
dictionary.Add(item, "CSV" + counter);
}
counter++;
}
var files2 = new[] { "SampleCSVFile_5300kb1.csv", "SampleCSVFile_5300kb2.csv", "SampleCSVFile_5300kb3.csv" };
foreach (var file in files2)
{
string csvValue;
if (dictionary.TryGetValue(file, out csvValue))
{
Console.WriteLine("{0} -> {1}", file, csvValue);
}
}
SampleCSVFile_5300kb1.csv -> CSV1
SampleCSVFile_5300kb2.csv -> CSV1
SampleCSVFile_5300kb3.csv -> CSV2