Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果是逗号分隔键,则无法在字典中按键查找值_C#_.net - Fatal编程技术网

C# 如果是逗号分隔键,则无法在字典中按键查找值

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 (

我有一个像下面这样的字典,其中我存储了文件名列表,根据文件数量生成的键为Csv1、Csv2

我有一个字符串数组,如下所示:

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