2017-04-07 43 views
3

对于大多数人(熟练的程序员)来说,标题可能听起来不太好,但是我在学习C#基础知识的第三周,我无法弄清楚如何解决下一个任务。 我将为一堆城市储存一些温度,首先要求用户输入cityName,然后再输入该城市的实际温度。所有这些东西都应该保存在列表<>中,我将使用Class和Constructor。 当我尝试打印出结果(使用的foreach),它打印出我的名字空间的名字和我的课,如“Task_5.City” 请告诉我错我的代码名称:为什么写入项目到控制台只写入命名空间和类名而不是数据?

public class City //class 
{ 
    public string CityName { get; set; } 
    public int Temperature { get; set; } 

    public City(string name, int temp)//konstruktor 
    { 
     this.CityName = name; 
     this.Temperature = temp; 
    } 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var cityList = new List<City>(); 

     Console.WriteLine("What is your city?"); 
     string cityName = Console.ReadLine(); 
     Console.WriteLine("What temperature for this city?"); 
     int temp = Convert.ToInt32(Console.ReadLine()); 

     City myCity = new City(cityName, temp); 
     cityList.Add(myCity); 


     foreach (var item in cityList) 
     { 
      Console.WriteLine(item); 
     } 

     Console.ReadLine(); 

    } 
} 

回答

5

您将对象传递给Console.WriteLine(item)而不是传递字符串。 Console.WriteLine调用ToString()该对象的方法默认返回名称空间+类名。您可以覆盖此行为就像下一个:

public class City //class 
    { 
     public string CityName { get; set; } 
     public int Temperature { get; set; } 

     public City(string name, int temp)//konstruktor 
     { 
      this.CityName = name; 
      this.Temperature = temp; 
     } 

     public override string ToString() 
     { 
      return string.Format("{0} {1}", CityName, Temperature); 
     } 

    } 

或者你可以使用WriteLine方法的另一个重载:

Console.WriteLine("{0} {1}", item.CityName, item.Temperature); 
3

变化Console.WriteLine(item);到以下选项之一,如果您只想写出City对象的内容。

Console.WriteLine("City: " + item.CityName + " has a temperature of " + item.Temperature + " degrees."); 

,或者您可以使用string.Format如果你喜欢:

Console.WriteLine(string.Format("City: {0} has a temperature of {1} degrees.", item.CityName, item.Temperature)); 
2

您正在使用的WriteLine这个重载:

public static void WriteLine(object value) 

与此重载调用参数的ToString法来生产其字符串表示。如Here所述,默认实现ToString返回该类型的完全限定名称。

您可以在City类中重写ToString是这种类型,其中一个字符串有望像Console.WriteLine

public override string ToString() 
{ 
    return CityName + Temperature.ToString(); 
    // return $"{CityName} : {Temperature}"; // Or use C# string interpolation 
} 

或者直接产生必需的字符串,并将其传递到WriteLine方法能够使用实例:

Console.WriteLine($"{item.CityName} : {item.Temperature}); 
0

在这里,你要打印的对象本身。如果您想打印城市名称和温度,则必须打印该属性。

foreach (var item in cityList) 
    { 
     Console.WriteLine(item.CityName); 
     Console.WriteLine(item.Temperature); 
    } 

但是,在这里,你只能得到一个城市和温度,然后打印它。为什么在这种情况下需要列表?

+0

'但是在这里,你只能得到一个城市和温度并且只能打印它。为什么在这种情况下需要一个列表?' - 这完全不相关,但让我帮忙回答:因为该代码要么显然是在进行中,要么被削减以缩小规模。将第二个城市添加到该列表非常容易,它仍然无法按预期工作。此外,OP明确表示,他将在那里存储“一堆城市”,所以,列表,惊喜! – quetzalcoatl

+0

是的,@quetzalcoatl你应该是对的。这可能是一个进行中的工作。我发现代码中缺少的东西比描述中的要少。只是想填补空白。这是一个很好的意图! :) – AnjuRaj

+0

@AnjuRaj为什么你需要在这种情况下的名单? 那么,因为到目前为止我已经学过了数组和列表,而且这个任务并没有让我使用任何我还没学过的东西。你会用什么?也许单变量,一个为Temp和一个为城市? – Gusto

2

cityList中的项目是City类型,这意味着您拥有CityName和Temperature的属性。

你应该使用:

Console.WriteLine(item.CityName + " is at " + item.Temperature + ".");

或类似的东西。

相关问题