不确定如何使用变量

时间:2017-12-24 05:04:12

标签: c# dictionary collections

我不确定要使用哪种集合类型,但我认为字典最适合这种情况。我需要能够创建键值对,我希望能够迭代它,最好是使用foreach循环。棘手的部分是,当我调用方法并将它们存储到集合中以供稍后使用时,我希望能够传入键和值(两个字符串)。

我在想这样的事情:

   public static void Main(string[] args)
    {
        DictionaryTest("this","that");
    }

public static void DictionaryTest(Dictionary<string, string> testDictionary)
{
    testDictionary.Add(string, string);


    foreach (KeyValuePair<string, string> fields in testDictionary)
    {
        Console.WriteLine(fields.Key);
        Console.WriteLine(fields.Value);
    }


}

问题是,我不确定如何将键值字符串设置为要使用的变量。此外,我甚至不确定使用字典是什么方式去这里,但我知道我不会在集合中有固定数量的条目,我想传递所有的键值对以后的另一种方法基本上用作搜索字段和搜索值。

总的来说,我想要一些建议和可能的方向来帮助指导我。关于方法论的更多问题与语法有关。

谢谢

更新:我最终这样做了......

   public static void Main(string[] args)
    {
        Dictionary<string, string> testDictionary = new Dictionary<string, string>();
        DictionaryTest("this","that");
    }
public static Dictionary<string,string> DictionaryTest(string Key, string Value)
{

    Dictionary<string, string> testDictionary = new Dictionary<string, string>();
    testDictionary.Add(Key,Value);

    foreach (KeyValuePair<string, string> fields in testDictionary)
    {
        Console.WriteLine(fields.Key);
        Console.WriteLine(fields.Value);
    }

    return testDictionary;

}

2 个答案:

答案 0 :(得分:2)

从评论中可以看出,您的问题似乎是您不了解DictionaryTest方法所期望的类型。它期待一个词典,你感到困惑的是<string, string>部分。这表明键和值都是字符串,而不是任何其他格式。

更简洁的例子:

Dictionary<key type, value type> variableName

所以要解决这个问题,你需要做的是创建一个字典作为参数传入。

public static void Main(string[] args)
{
    DictionaryTest(new Dictionary<string, string>(){{"this","that"}});
}

注意,我创建了一个Dictionary对象,其中包含一个值,key:this和value:that。

答案 1 :(得分:2)

我已将您的代码调整为我认为您要求的内容:

//you ever need a class wide variable to hold your dictionary, or you need to make a new one in the Main method 
static Dictionary<string, string> myDict = new Dictionary<string, string>();

public static void Main(string[] args)
{
    DictionaryTest(myDict, "this","that"); //you didn't pass a dictionary object when you called this method
}

public static void DictionaryTest(Dictionary<string, string> testDictionary, string keyToAdd, string valToAdd) //you didn't have parameters for the strings you passed when you called this method
{
  testDictionary[keyToAdd] = valToAdd; //same as Add(), but doesn't crash on dupe

  //I generally iterate dictionaries by iterating the keys collection and accessing the dictionary whenever I need to, rather than accessing a collection of keyvaluepair
  foreach (string key in testDictionary.Keys)
  {
    Console.WriteLine(key);
    Console.WriteLine(testDictionary[key]);
  }


}

这不是处理事情的唯一方式。编码方式多次是偏好而不是规则,它受客户希望工作方式的影响。不要把这段代码作为你必须做的事情的严格规则,这只是一种有效的方法

Adriani6对原始代码中的混淆提出了一个很好的观点:

Dictionary<string, string>只是指“一个字符串,其键是一个字符串,其值是一个字符串”。它本身就是一种完整类型的对象,与(例如)Dictionary<int, string>不同 - 这些东西与Customer和Order在经典销售系统中的类型不同。泛型是编译器在编译之前为你编写一堆代码的东西之一,这意味着泛型Dictionary变成一个专门用于字符串,字符串(另一个完全独立的字符串,例如int) - 编译器实际写为我们提供了大量的代码,使语言的各种功能发挥作用,并为我们提供了一种更简洁的语法,而不是早期的所有这些东西必须由我们人类编写。

当你声明你的DictionaryTest方法采用了一个类型为Dictionary的单个参数时,然后尝试将它传递给两个字符串,C#不会想到“哦,该方法要求一个双弦字典,以及两个字符串正在通过,显然我会用它们作为关键和价值......“因为它不能有几个原因:

  • 从哪里获取实际的字典对象,使用这些字符串?
  • 哪一个是关键,哪个是值?
  • 方法解析纯粹是查看传递的参数的类型和顺序,它不会查看存储在对象中的类型并猜测。这是另一个例子:

    class Person{
      string Name;
      int Age;
      bool IsMale;
    }
    
    ...
    public void RegisterPerson(Person p) //a method 
    
    
    ...
    
    RegisterPerson("John", 31, true);
    

RegisterPerson方法接受一个Person对象,c#不能接受你传递一堆有效构成一个人的原始类型,并自动为你创建一个人并将其传递给方法..你可以用< / p>

RegisterPerson(new Person(){ Name = "John", Age = 31, IsMale = true });

或者你可以定义一个带有原语并创建一个新人的重载:

public void RegisterPerson(Person p){ ... }
public void RegisterPerson(string name, int age, bool IsMale) {
  RegisterPerson(new Person(){ Name = name, Age = age, IsMale = IsMale});

只是c#不会为你做这件事。希望你能看到这也适用于你的字典情况