webForumDet fria alternativet

Konvertera array

.NETur .NET

4 svar · 273 visningar · startad av niels

nielsMedlem sedan juli 2000212 inlägg
#1

Jag vill skapa en klass "Pair" med medlems variablerna "first" och "second". Sedan vill jag skapa en array med Pair object där jag kan sortera efter "second". Och jag vill kunna konvertera till en string[] som innehålle bara värden från "first".

Så här långt har jag kommit:

public class Pair : IComparable
	{
		private object first;
		private object second;

		public Pair(object first, object second) 
		{
			this.first = first;
			this.second = second;
		}

		public object Second
		{
			get 
			{
				return second;
			}

			set
			{
				second = value;
			}
		}

		public object First
		{
			get 
			{
				return first;
			}

			set
			{
				first = value;
			}
		}

		public static explicit operator string(Pair p)
		{
			return p.first.ToString();
		}

		/*
		public override string ToString()
		{
			return first.ToString();
		}
		*/

		public int CompareTo(object obj)
		{
			Pair p = (Pair) obj;
			return ((IComparable)this.second).CompareTo((IComparable)p.second);
		}

	}

Detta funkar då så klart inte:

ArrayList result = new ArrayList();
result.Add(new Pair("olle", 3));
result.Add(new Pair("nisse", 4));

result.Sort(); //funkar fint!

string[] members = (string[]) result.ToArray(typeof(string)); //blir galet

Jag får exception: "Additional information: At least one element in the source array could not be cast down to the destination array type."

Så till frågan: hur gör jag för att på ett snyggt sätt konvertera en lista med Pair object till en string[] med bara värden från first??

Självklart kan man göra det på det fula sättet med en loop men det vill jag hellst undvika.

tack för svar!
/Nisse

Mc FettoMedlem sedan nov. 20022 355 inlägg
#2
string[] str = new string[result.Count];
Pair tmpPair;
for (int i=0;i<result.Count;i++){
	tmpPair = (Pair)result[i];
	str[i] = (string)tmpPair.First;

}

Vet inte riktigt hur du kan casta över direkt från din arraylist till strängvektorn utan att använda dig av ett temporärt objekt av typen Pair men det borde ju gå!

Mc FettoMedlem sedan nov. 20022 355 inlägg
#3

Du kan ifs göra såhär:

static void Main(string[] args)
{

	ArrayList result = new ArrayList();
	result.Add(new Pair("olle", 3));
	result.Add(new Pair("nisse", 4));

	result.Sort(); //funkar fint!
	string[] str = new string[result.Count];

	for (int i=0;i<result.Count;i++)
		str[i] = (string)((Pair)result[i]).First;
}

Då blir du av med den temporära variablen!

nielsMedlem sedan juli 2000212 inlägg
#4

tack, jag var bara så bortskämd att jag hoppades på att man kunde göra det på en rad.

Mc FettoMedlem sedan nov. 20022 355 inlägg
#5

tja, nu blev det på två rader :). ivf så blir där en loop även om det skulle skrivas på en rad. Bar för att det inte skrivs i koden så betyder det ju inte att det utförs!

132 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)