Przypisanie w pętli wartości dla wszystkich zmiennych danego obiektu

0

Witam
Proszę o informację, czy jest jakaś możliwość przypisania w pętli wartości dla wszystkich zmiennych danego obiektu (w tym przypadku struktura Osoba)? W pierwszym przypadku wszystko działa, jednak jeśli struktura powiększy się do kilkunastu albo kilkudziesięciu elementów kod stanie się mało czytelny.

 public struct Osoba
    {
        public string imie1, imie2,
            nazwisko;
    }

public void Wczytaj()
{
	
	Osoba[] student = new Osoba[10];

	for (int i = 0; i < student.Length; i++)
	{
		student[i].imie1 = "wartosc 1";
		student[i].imie2 = "wartosc 2";
		student[i].nazwisko = "wartosc 3";
	}
}

Drugi przypadek przedstawia coś co chciałbym osiągnąć (oczywiście zamiast tablicy string [tablica] wolałbym użyć tablicy zmiennych ze struktury Osoba). Czy jest to możliwe?

	string[] tablica = {imie1, imie2, nazwisko};	
	for (int i = 0; i < student.Length; i++)
	{
		for (int j=0;j<tablica.Length;j++) 
		{
		student[i].tablica[j] = "wartosc "+j;
		}
	} 
1

może lepiej zrób coś takiego:

public class Osoba
{
	public Osoba(string Imie, string Nazwisko)
	{
		this.Imie = Imie;
		this.Nazwisko = Nazwisko;
	}
	
	public string Imie {get; set; }
	public string Nazwisko {get; set; }
}

List<Osoba> ListOsob = new List<Osoba>();
ListOsob.Add(new Osoba("Imie", "Nazwisko"));

foreach (Osoba osoba in ListOsob)
	MessageBox.Show(string.Concat(osoba.Imie, " ", osoba.Nazwisko));

pisałem w notepadzie, wiec moga byc jakies literowki

1

Jeśli chciałbyś robić różne rzeczy z konkretnie oznaczonymi polami:

using System;
using System.Reflection;

public class Test
{
	class YourTagAttribute : Attribute{}
	
	class Person
	{
		[YourTag()]
		string Name;
		[YourTag()]
		string SurrName;
	}
	public static void Main()
	{
		var person = new Person();
		FieldInfo[] infos = person.GetType().GetFields();
		foreach(var info in infos)
		{
			if(info.IsDefined(typeof(YourTagAttribute), true))
				info.GetValue(person)/*... miłej zabawy*/;
		}
	}
}

Do twojego przypadku: prototype z copy constructor/clone():
http://stackoverflow.com/questions/3345389/copy-constructor-versus-clone
https://msdn.microsoft.com/pl-pl/library/ms173116.aspx
http://www.dofactory.com/net/prototype-design-pattern
http://www.codeproject.com/Articles/476807/Understanding-and-Implementing-Prototype-Pattern-i

0

Ale jakie wartości chcesz przypisać i po co? Jeśli losowe do testów, to użyj biblioteki AutoFixture.

P.S. Osoba to powinna być klasa, a nie struktura.

0

**somekind **

Chcę przypisać każdej zmiennej ze struktury Osoba konkretne wartości. Potrzebuję stworzyć tablicę obiektu Osoba, tak, żeby Osoba[i] przechowywała wszystkie zmienne obiektu. Np.

public struct Osoba
{
public string zmienna1, zmienna2, (...) ,zmienna30;
}


Osoba[] student = new Osoba[2000]

for (int i=0,i<student.Length;i++)
{
student[i].zmienna1 = "jakaś wartość1";
(...)
student[i].zmienna30 = "jakaś wartość 30";
}

A następnie móc się odwołać do konkretnego pola i coś zmienić, np.

if (student[250].zmienna1=="Tomek") {student[250].zmienna25="Kielce";}
if (student[250].zmienna1=="Tomek" && student[250].zmienna2=="Maciej") {student[250].zmienna20="Student";}

Dla struktury to działa (przypisanie elementów do tablicy struktury Osoba), niestety dla klasy wywala błąd. Przykłady testowe:

    
public struct Osoba3
   {
       public string imie, imie2, nazwisko;
   }

public class Osoba4
    {
        public string imie { get; set; }
        public string imie2 { get; set; }
        public string nazwisko { get; set; }
    } 


Osoba3[] student = new Osoba3[2000];
student[0].imie = "T";
//// działa bez problemu


Osoba4[] student = new Osoba4[2000];
 student[0].imie = "T";
//// zwraca wyjątek NullReferenceException
0

robisz to źle. A gdzie

new

?
użyj Add a nie po indexach.. dałem Ci przykład.

0
.Al napisał(a):

foreach (Osoba osoba in ListOsob)
MessageBox.Show(string.Concat(osoba.Imie, " ", osoba.Nazwisko));



Możliwe jest wyświetlenie wszystkich pól z listy bez konieczności podawania konkretnych nazw zmiennych? 

Zamiast:
```csharp
MessageBox.Show(string.Concat(osoba.Imie, " ", osoba.Nazwisko));

Coś takiego:

MessageBox.Show(osoba);

W takiej formie to na pewno nie działa, ale czy w ogóle jest szansa, żeby coś takiego osiągnąć?

2
class Osoba
{
     public string Imie {get;set;}
     public string Nazwisko {get;set;}
     public int Wiek {get;set;}
    
     public override ToString()
     {
          return string.Format("Nazywam się {0} {1} i mam {2} lata",Imie,Nazwisko,Wiek);
     }
}

MessageBox.Show(osoba.ToString());
//albo wystarczy samo 
MessageBox.Show(osoba); //ale tego nie jestem pewny

1 użytkowników online, w tym zalogowanych: 0, gości: 1