The name '...' does not exist in the current context - c#

I have a list within my Main() and I'm trying to add an item to that list from within a variable. But it's throwing the error "The name 'dogList' does not exist in the current context"
Inside my addDog() method, dogList.Add() is not working due to above.
namespace DoggyDatabase
{
public class Program
{
public static void Main(string[] args)
{
// create the list using the Dog class
List<Dog> dogList = new List<Dog>();
// Get user input
Console.WriteLine("Dogs Name:");
string inputName = Console.ReadLine();
Console.WriteLine("Dogs Age:");
int inputAge = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Dogs Sex:");
string inputSex = Console.ReadLine();
Console.WriteLine("Dogs Breed:");
string inputBreed = Console.ReadLine();
Console.WriteLine("Dogs Colour:");
string inputColour = Console.ReadLine();
Console.WriteLine("Dogs Weight:");
int inputWeight = Convert.ToInt32(Console.ReadLine());
// add input to the list.
addDog(inputName, inputAge, inputSex, inputBreed, inputColour, inputWeight);
}
public static void addDog(string name, int age, string sex, string breed, string colour, int weight)
{
// The name 'dogList' does not exist in the current context
dogList.Add(new Dog()
{
name = name,
age = age,
sex = sex,
breed = breed,
colour = colour,
weight = weight
});
}
}
public class Dog
{
public string name { get; set; }
public int age { get; set; }
public string sex { get; set; }
public string breed { get; set; }
public string colour { get; set; }
public int weight { get; set; }
}
}

dogList is local to the method Main. What you want to do instead is to place dogList outside of that scope.
public class Program
{
static List<Dog> dogList = new List<Dog>();
...
Alternately you can send the list into your add method.

dogList exists only in the scope of the Main method. If you declare a variable in one method it becomes local and cannot be accessed in another method.
You could solve it by passing the necessary variable as a parameter:
public static void addDog(string name, int age, string sex, string breed, string colour, int weight, List<Dog> dogList)
now you pass the variable in the call like this:
// add input to the list.
addDog(inputName, inputAge, inputSex, inputBreed, inputColour, inputWeight, dogList);
or you can declare the variable at the scope of the class:
public class Program
{
// create the list using the Dog class
static List<Dog> dogList = new List<Dog>();
In the latter version you need to declare it as static, otherwise the compiler will demand an Instance of the class Program to be able to access the variable

The dogList variable is scoped local to the Main method, so it is not accessible to other method in your class, you have few ways to make it correct, one solution can be to pass the dogList as well as parameter to that method like:
// add input to the list.
addDog(inputName, inputAge, inputSex, inputBreed, inputColour, inputWeight,dogList);
and change the signature of addDog method as well to be :
public static void addDog(string name, int age, string sex, string breed, string colour, int weight, List < Dog > dogList)
{
}
If you don't want to do that way, another solution can be to make your dogList variable at class level i.e. make it field like:
public class Program
{
List<Dog> dogList = new List<Dog>();
}

The main problem is that you have declared dogList locally from within main. You have also declared addDog as static. Static methods are outside of the current object.
Think of Main as your living room you are standing in your living room. Now think of addDog as your bathroom I am standing in there. We have know knowledge that each other is there so there is no way of us to communicate.
public class DogDb
{
// DogDb contains a list of dogs
public List<Dog> dogs { get; set; }
public DogDb() {
dogs = new List<Dog>();
}
// DogDb can control adding new dogs to its list of dogs.
public void addDog(string name, int age, string sex, string breed, string colour, int weight)
{
dogs.Add(new Dog()
{
name = name,
age = age,
sex = sex,
breed = breed,
colour = colour,
weight = weight
});
}
public class Dog
{
public string name { get; set; }
public int age { get; set; }
public string sex { get; set; }
public string breed { get; set; }
public string colour { get; set; }
public int weight { get; set; }
}
}
public class Program
{
public static void Main(string[] args)
{
// Create a new instance of our DogDB class.
var DogDb = new DogDb();
// Get user input
Console.WriteLine("Dogs Name:");
string inputName = Console.ReadLine();
Console.WriteLine("Dogs Age:");
int inputAge = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Dogs Sex:");
string inputSex = Console.ReadLine();
Console.WriteLine("Dogs Breed:");
string inputBreed = Console.ReadLine();
Console.WriteLine("Dogs Colour:");
string inputColour = Console.ReadLine();
Console.WriteLine("Dogs Weight:");
int inputWeight = Convert.ToInt32(Console.ReadLine());
// add input to the object.
DogDb.addDog(inputName, inputAge, inputSex, inputBreed, inputColour, inputWeight);
}

#Ari....Here is how you can do it
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
namespace DoggyDatabase
{
public class Program
{
private static List<Dog> dogList = new List<Dog>();
public static void Main(string[] args)
{
// create the list using the Dog class
// Get user input
Console.WriteLine("Dogs Name:");
string inputName = Console.ReadLine();
Console.WriteLine("Dogs Age:");
int inputAge = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Dogs Sex:");
string inputSex = Console.ReadLine();
Console.WriteLine("Dogs Breed:");
string inputBreed = Console.ReadLine();
Console.WriteLine("Dogs Colour:");
string inputColour = Console.ReadLine();
Console.WriteLine("Dogs Weight:");
int inputWeight = Convert.ToInt32(Console.ReadLine());
// add input to the list.
addDog(inputName, inputAge, inputSex, inputBreed, inputColour, inputWeight);
}
public static void addDog(string name, int age, string sex, string breed, string colour, int weight)
{
// The name 'dogList' does not exist in the current context
dogList.Add(new Dog()
{
name = name,
age = age,
sex = sex,
breed = breed,
colour = colour,
weight = weight
});
}
}
public class Dog
{
public string name { get; set; }
public int age { get; set; }
public string sex { get; set; }
public string breed { get; set; }
public string colour { get; set; }
public int weight { get; set; }
}
}
}
The list was inaccessible due to its protection level.When you have to use a list in another method then you have to declare it first.Happy coding

Related

How to get an output of an object stored in an array in C#

I am stuck at a really stupid mistake.
I want to create an object of the Class Car and store the objects in an array.
So far so good.
But I cant figure out how, or better to say why I cant get any output which makes sence with Console.WriteLine();
I am pretty sure the solution is simple as always, but I cant figure it out on my own.
This is my code
static void Main(string[] args)
{
Car audi = new Car("Audi", "A4", 4); //string Lable, string name, int tires
Car vw = new Car("VW", "Golf", 4);
Car[] carcollection = new Car[] {audi,vw};
Console.WriteLine(carcollection[0]);
}
So is there a way that i can write all the values of an object with Console.WriteLine() without typing in audi.Name, audi.Lable etc?
If using record is allowed. Try this: (.NET 5+)
public record Car(string Name, string model, int doors);
Then in your class:
public class MyClass {
public void ShowCarInfo() {
Car audi = new Car("Audi", "A4", 4);
Car vw = new Car("VW", "Golf", 4);
Car[] carcollection = new Car[] {audi,vw};
Console.WriteLine(carcollection[0]);
}
}
Output: Car { Name = Audi, model = A4, doors = 4 }
So you would define the class Car as follows: public class Gar
{
public string name;
public string label;
public string GetInfoOfCar()
{
return this.name + " " + this.label;
}
}
Then the "GetInfoOfCar" method will return the desired information.
To extract object information, you can do the following:
Console.WriteLine(carcollection[0].GetInfoOfCar());
As mentioned in comments, you can solve this by overriding Car.ToString():
public class Car
{
public string Name;
public string Label;
public int TireCount;
public Car(string label, string name, int tires)
{
Name = name; Label = label; TireCount = tires;
}
public override string ToString()
{
return $"{Label} {Name}, ({TireCount} tire{ (TireCount == 1 ? string.Empty : "s") })";
}
}
Now, whenever you call Console.WriteLine(carcollection[0]), Console.WriteLine will automatically call ToString() on the car and print Audi A4, (4 tires) for example.
Console.WriteLine requires an string input to correctly print result, so it converts your Car object to string by calling default ToString method. The default behaviour for this method is to provide full type name of your class as string object.
But you can override it in your class like this, or use Record type, example of which was provided in other answers.
class Car
{
public string Label { get; set; }
public string Name { get; set; }
public long Tires { get; set; }
public Car(string label, string name, long tires)
{
Label = label;
Name = name;
Tires = tires;
}
public override string ToString()
{
return $"Brand: {Label}, Label: {Name}, Tires: {Tires}";
}
}
class Program
{
static async Task Main(string[] args)
{
Car audi = new Car("Audi", "A4", 4); //string Lable, string name, int tires
Car vw = new Car("VW", "Golf", 4);
Car[] carcollection = new Car[] { audi, vw };
Console.WriteLine(carcollection[0]);
}
}

C# Refer to a Specific Item in a List<Custom Class>

I created a class of collectables. The class contains a string Name, int Points and int Damage. I created a Collectable instance called "lifeforce" "Life Force" is the Name and Points is set with a value of 1000. When a separate class of immortals is instantiated I add a Collectable instance to a List to the immortal. If I want to see how many points the immortal instance has for his/her Life Force, how do I refer to the lifeforce Points to get the value? Code below.
public class Collectable
{
public string Name { get; set; }
public int Points { get; set; }
public int Damage { get; set; }
public Collectable(string name, int points, int damage)
{
Name = name;
Points = points;
Damage = damage;
}
}
public class Immortal
{
public string Name { get; set; }
public string Origin { get; set; }
public string Superpower { get; set; }
public List<Collectable> Carrying { get; set; }
public string Saying { get; set; }
public string Bent { get; set; }
public Immortal(string name, string origin, string superpower, string saying, string bent, Collectable item)
{
Name = name;
Origin = origin;
Superpower = superpower;
Saying = saying;
Bent = bent;
this.Carrying = new List<Collectable>();
this.Carrying.Add(item);
}
public void Pickup(Collectable item)
{
this.Carrying.Add(item);
}
}
static void Main(string[] args)
{
Collectable lifeforce = new Collectable("Life Force", 1000, 0);
Collectable rubystone = new Collectable("Ruby Stone", 200, 0);
Collectable bagofdiamonds = new Collectable("Diamond Bag", 500, 0);
Immortal mighty = new Immortal("Mighty Man", "Mightopolis", "Might", "I am a mighty man!", "good",lifeforce);
foreach (var collecteditem in mighty.Carrying)
{
Console.WriteLine("Items in bag - " + collecteditem.Name);
}
var lifeforceIndx = 0;
lifeforceIndx = mighty.Carrying[0].Points
Console.WriteLine("Your Life Force is at " + mighty.Carrying[0].Points.ToString());
Console.ReadLine();
}
You can do :
Console.WriteLine("Your Life Force is at " + mighty.Carrying.Where(x=>x.Name == "Life Force").Sum(x=>x.Points).ToString());
To find all Collectables named "Life Force" just use
Carrying.Where(collectable => string.Equals(collectable.Name, "Life Force", StringComparison.OrdinalIgnoreCase));
Ignore case is necessary for cases when Name property has different spelling.
But I recommend to create Enum with collectable types and use this Enum in Collectable class.
For example
public class Collectable
{
public string Name { get; set; }
public int Points { get; set; }
public int Damage { get; set; }
public CollectableType Type { get; }
public Collectable(string name, int points,
int damage, CollectableType type)
{
Name = name;
Points = points;
Damage = damage;
Type = type;
}
}
And find all Life Force collectables like shown in code below
Collectables.Where(collectable => collectable.Type == CollectableType.LifeForce);
If you need sum of points than just add .Sum(collectable => collectable.Points) to get
Collectables.Where(collectable => collectable.Type == CollectableType.LifeForce)
.Sum(collectable => collectable.Points);
If I get it right then this is the solution.

Dynamically creating and calling a class using Reflection in a console application

I have some problems about this section in C# language.
So I'm trying to do something like revealing reflection of this class and it's methods.
class Car
{
public string Name { get; set; }
public int Shifts{ get; set; }
public Car(string name, int shifts)
{
Name = name;
Shifts = shifts;
}
public string GetCarInfo()
{
return "Car " + Name + " has number of shifts: " + Shifts;
}
}
So I have this class Car, and this method GetCarInfo(), now, I'm trying to:
Dynamically create instance of this class Car, and dynamically calling a method GetCarInfo(), I would like to show result in console, but I can't when I run it it shows build errors. The application break every time.
Edit
Errors
Here's a example
namespace ConsoltedeTEstes
{
class Program
{
static void Main(string[] args)
{
//Get the type of the car, be careful with the full name of class
Type t = Type.GetType("ConsoltedeTEstes.Car");
//Create a new object passing the parameters
var dynamicCar = Activator.CreateInstance(t, "User", 2);
//Get the method you want
var method = ((object)dynamicCar).GetType().GetMethod("GetCarInfo");
//Get the value of the method
var returnOfMethod = method.Invoke(dynamicCar, new string[0]);
Console.ReadKey();
}
}
public class Car
{
public string Name { get; set; }
public int Shifts { get; set; }
public Car(string name, int shifts)
{
Name = name;
Shifts = shifts;
}
public string GetCarInfo()
{
return "Car " + Name + " has number of shifts: " + Shifts;
}
}
}

How to pass a string from Class 1 to Class 2 to Class 3?

I have 3 classes (UCourse, Student and Teacher) and each class has a unique string property.
Is there a simple way I can take the string property from the first class UCourse, pass it into a 2nd class Student, and then pass that string plus another string from the 2nd class into a 3rd class Teacher?
This is what I have so far for my 3 classes:
using System;
namespace EDXonline_AssignmentFour
{
class Program
{
class UCourse
{
// Set the unique string for the 1st class
private string course = "Computer Scienece";
public string Course
{
get { return course; }
}
}
class Student
{
// Get the string from the 1st class
UCourse ucourse = new UCourse();
public string coursef1
{
get { return ucourse.Course; }
}
// Set the unique string for the 2nd class
private string name = "zach";
public string Name
{
get { return name; }
}
}
class Teacher
{
Student student = new Student();
private string namet = "Sally";
// Get the unique string from the 2nd class
public string namef1
{
get { return student.Name; }
}
// Set the unique string for the 3rd class
public string Namet
{
get { return namet; }
}
}
}
}
Then, I need to create an instance of Teacher and by using only this instance of Teacher, I need to output all string properties from each of the 3 classes like this:
public static void Main (string [] args)
{
Teacher teacher = new Teacher();
Console.WriteLine("{0} and {1} are in {2}",
teacher.namef1, teacher.Namet /*, UCourse string from the 1st class goes here*/);
}
So far that works to display the strings from the 2nd and 3rd classes, but how can I get the value of the UCourse string from the first class as well?
If you want to use your existing code and keep passing the strings through properties, then you almost solved it because your Main() method already shows the correct values of the strings from the 2nd and 3rd classes.
To access the string from the 1st class and use it in the 3rd class, you can add another property to the 3rd class to get it (same as you already did to get the string from the 2nd class).
For example:
class Teacher
{
Student student = new Student();
// Get the unique string from the 2nd class
public string namef1
{
get { return student.Name; }
}
// Get the unique string from the 1st class that's already stored in the 2nd class
public string UCourseName
{
get { return student.coursef1; }
}
// Set the string for the third class
private string namet = "Sally";
public string Namet
{
get { return namet; }
}
}
And then you can update your Main() method to use it like this:
public static void Main(string[] args)
{
Teacher teacher = new Teacher();
// Writes "Zach and Sally are in Computer Science"
Console.WriteLine("{0} and {1} are in {2}",
teacher.namef1, teacher.Namet, teacher.UCourseName);
Console.ReadLine();
}
that would be :
internal class Program
{
private static void Main( string[] args )
{
Teacher teacher = new Teacher();
Console.WriteLine("{0} and {1} are in {2}",
teacher.Namef1, teacher.Namet, teacher.Course);
}
private class UCourse
{
// Set the unique string for the 1st class
private readonly string course = "Computer Scienece";
public string Course { get { return this.course; } }
}
private class Student
{
// Set the unique string for the 2nd class
private readonly string _name = "zach";
public string Name { get { return this._name; } }
// Get the string from the 1st class
private readonly UCourse _ucourse = new UCourse( );
public string Coursef1 { get { return this._ucourse.Course; } }
}
private class Teacher
{
private readonly Student _student = new Student( );
// Get the unique string from the 1nd class
public string Course { get { return this._student.Coursef1; } }
// Get the unique string from the 2nd class
public string Namef1 { get { return this._student.Name; } }
// Set the unique string for the 3rd class
private readonly string _namet = "Sally";
public string Namet { get { return this._namet; } }
}
}
I recommend that you rethink your classes. Here is a small example:
using System;
using System.Collections.Generic;
namespace Example
{
public class Course
{
public string CourseTitle { get; set; }
public List<Student> Students { get; set; }
public Course(string courseTitle)
{
CourseTitle = courseTitle;
Students = new List<Student>();
}
}
public class Student
{
public string Name { get; set; }
public Student(string name)
{
Name = name;
}
}
public class Teacher
{
public string Name { get; set; }
public List<Course> Courses { get; set; }
public Teacher(string name)
{
Name = name;
Courses = new List<Course>();
}
}
class Program
{
static void Main(string[] args)
{
List<Teacher> teachers = new List<Teacher>();
Course course1 = new Course("Astrophysics A");
Course course2 = new Course("Coding C#");
Student student1 = new Student("Peter");
Student student2 = new Student("Bill");
Student student3 = new Student("Anna");
Teacher teacher1 = new Teacher("Mr. Williams");
Teacher teacher2 = new Teacher("Mr. Jacobson");
course1.Students.Add(student1);
course1.Students.Add(student3);
course2.Students.Add(student2);
teacher1.Courses.Add(course1);
teacher2.Courses.Add(course2);
teachers.Add(teacher1);
teachers.Add(teacher2);
foreach (Teacher teacher in teachers)
{
foreach (Course course in teacher.Courses)
{
foreach (Student student in course.Students)
{
Console.WriteLine("{0} and {1} are in {2}", student.Name, teacher.Name, course.CourseTitle);
}
}
}
Console.ReadLine();
}
}
}
I guess this way provides you more flexibility, in your code only 1 to 1 connections are possible.
Hope this was helpful.

Getting information from struct in a different method to where it's set using C#

So basically my issue is that I have a method in my program that sets the data in a struct for a student which looks like:
public static void addingstudent(){
student student;
AddStudent details = new AddStudent();
student.name = details.setName();
student.course = details.setCourse();
student.studentno = details.setStudentNumber();
student.year = details.setYear();
menu();
}
The AddStudent class contains a few methods for asking the user to input the Name etc. and returning them, an example in this class would be:
public static int setStudentNo(){
Console.Write("Please enter Student Number: ");
int StudentNo = int.Parse(Console.ReadLine());
return StudentNo;
}
And then I'm trying to access that data and display it on screen with:
public static void getstudent(){
student student;
student.displayDetails();
}
Which is just displaying null values for all the variables, however if I call this after first setting the values it displays correctly, lastly the struct looks like:
public struct student{
public String name;
public int studentno;
public String course;
public int year;
public void displayDetails(){
Console.WriteLine("Name: " + name);
Console.WriteLine("Student Number: "+studentno);
Console.WriteLine("Course: "+course);
Console.WriteLine("Year: "+year);
}
You user student student in addingstudent() but another student student in getstudent() as far as I can see... you are not using the same object...
You can have a class which has the struct and the two functions
class A
{
studnet studnet;
public static void addingstudent()
{
AddStudent details = new AddStudent();
student.name = details.setName();
student.course = details.setCourse();
student.studentno = details.setStudentNumber();
student.year = details.setYear();
menu();
}
public static void getstudent()
{
student.displayDetails();
}
}
Then just create a new A class and manipulate with the data however you want
Creating mutable structs is a bad idea in the first place, if the data is mutable you really should create a class.
Also, you are not passing the stuct as a parameter, for example in getstudent you are creating a new student object every time, this is why student.displayDetails(); is showing null, because you have not set any of the properties of the student you created on the line before you call it.
public static void getstudent()
{
Student student; // creates a new instance of the struct...
student.displayDetails(); // obviously student properties are null...
}
Really you should be doing something like the following.
public class Student
{
public Student()
{
this.SetName();
this.SetNumber();
this.SetCourse()
this.SetYear();
}
public override string ToString()
{
return string.Format(
"Name: {0}{4}Number: {1}{4}Course: {2}{4}Year: {3}{4}",
this.Name,
this.Number,
this.Course,
this.Year,
Environment.NewLine);
}
public void DisplayDetails()
{
Console.WriteLine(this.ToString());
}
public string Name { get; private set; }
public string Number{ get; private set; }
public string Course { get; private set; }
public string Year { get; private set; }
public static void SetName()
{
Console.WriteLine("Please enter Name: ");
this.Name = Console.ReadLine();
}
public static void SetNumber()
{
Console.WriteLine("Please enter Number: ");
this.Number = int.Parse(Console.ReadLine());
}
public static void SetCourse()
{
Console.WriteLine("Please enter Course: ");
this.Course = Console.ReadLine();
}
public static void SetYear()
{
Console.WriteLine("Please enter Year: ");
this.Year = int.Parse(Console.ReadLine());
}
}
public class App
{
public static void Main()
{
Student student1 = new Student(); // Create a student
student1.DisplayDetails(); // show the details
student1.SetName(); // change the name
student1.SetYear(); // change the year
student1.DisplayDetails(); // show the new details
// etc...
}
}

Categories