C# If Anweisung fuer Array formulieren

In einem Einzeiler höchstens mit LINQ, womit du eine strukturierte Abfrage machst wie bei SQL. Ansonsten einfach selbst 2 Methoden implementieren, die das überprüfen.

edit: meine Lösung mit LINQ

int?[] test = new int?[] {5, 5} ;
int count = (from zahl in test where (zahl == null) select zahl).Count();
if (count == 0 || count == test.Length)
{

}
else
// exception
 
Zuletzt bearbeitet:
so als einzeler glaub wie du das willst nicht direkt. sonst einfach über alle Elemente drüber schauen und jedes einzeln überprüfen und wenn eins nicht stimmt abbrechen.
 
Ich nehme an du meinst mit int, dass sie einen gewissen Wert haben?
Die Lösung ist Linq:
Code:
#using System.Linq;

[...]

int?[] array;
int specialValue;

[...]

if (array.All(item => !item.HasValue) || array.All(item => item.HasValue && item.Value == specialValue)
{

[...]

}
 
Hi,
das sollte möglich sein.
Du hast doch das Array bestimmt erst mit einer festen Größe initialisiert (oder mit einer Anzahl von Zahlen)
Also kannst doch einfach mit einer for schleife durch für die Anzahl der Elemente iterieren. Und dabei in jedem Schritt diese if Abfrage durchführen.

Wenn eins gefunden wird gilt es nicht mehr für alle und schmeißt man eine exception.
 
palaber
so wie ich es verstanden habe, mach einfach eine while schleife mit Abbruchbedingung (sonst hast du eine Endlosschleife) Noch einfacher wäre eine for schleife, in der dann die if Abfragen sind. Als Abbruchbedingung nimmst die die Feldlänge des Feldes dass du durchgehen willst.
In der schleife schreibst du die Bedingungen (if) rein.


bsp
i=0;
while (i!=feldlänge)
{ if (bla bla)
do
else (bla bla)
do
i++};

(soll nur ein Bsp sein, schon etwas lange her ^^)
 
Zuletzt bearbeitet:
Ich weiss nicht ob das mit Linq klappt.

Ich will naemlich abfragen ob alle Elemente "null" sind, oder alle Elemente eine beliebige Zahl.
Kann nicht festlegen um welche zahl es sich handelt.

Evtl. habe das mit dem Linq noch nicht ganz verstanden. Werde mich aber nochmal einlesen und rum probieren. Ob es heute noch was wird weiss ich aber nicht.

Edit:
Das Problem ist nicht wie ich das Array abfrage, sondern wie ich die If Bedinung formuliere ;)

Edit: Worauf ich hinaus will ist, dass das Array entweder "leer" ist oder komplett gefuellt.
Sprich: array[0] = "null", array[1] = "null" usw.
oder: array [0] = zahl x, array[1] = zahl y usw.
nicht: array [0] = zahl x, array[1] = "null"
 
Zuletzt bearbeitet:
In meiner Lösung habe ich das so implementiert mit LINQ, dass es eine beliebige Zahl ist, also entweder alles null oder nichts null. Nämlich jeder Wert von int?, der nicht null ist, muss zwangsläufig eine beliebige Zahl sein oder nicht?
 
kinglouy schrieb:
In meiner Lösung habe ich das so implementiert mit LINQ, dass es eine beliebige Zahl ist, also entweder alles null oder nichts null. Nämlich jeder Wert von int?, der nicht null ist, muss zwangsläufig eine beliebige Zahl sein oder nicht?

Deine Lösung ist vollkommen korrekt, keine Ahnung, welches Problem der TE damit hat.
Evtl. hilft es, das Statement etwas umzuformulieren:
Code:
int count = array.Count( i => i.HasValue );
if ( count == 0 || count == array.Length ) {...}
 
Code:
if (array.All(item => !item.HasValue) || array.All(item => item.HasValue))
 
@TE natürlich funktioniert das...

pvc-junkies Antwort ist die Vereinfachung meiner Antwort auf die veränderten Bedingungen des TE und als solche genau was der TE sucht.

Hier die All-Extension-Method zu verwenden ist sicherlich übersichtlicher als die normale Linq-Syntax mit
Code:
((from item in array where item.HasValue select item) == array.Count) || ((from item in array where !item.HasValue select item) == array.Count)

Warum komplizierte mehrzeiler, wenn alles so schön einfach ist?
 
Ich würde aber dennoch eine lokale Variable verwenden, da das Statement so 2 mal ausgeführt wird.
 
Ich würde hier gern noch eine ganz naive und simple Lösung unterbreiten. Da ich C#-fern bin, in Java ausformuliert, aber sicherlich verständlicher für Programmierer, die nicht mit Linq vertraut sind.

P.S.: ich glaube dieser Lösungsweg wurde hier auch schon angedeutet.

Code:
	/**
	 * Checks if the specified array contains anything else but null.
	 * @param elements
	 * @return true if all elements in the array are null, false if not or array length is 0
	 */
	public static <T> boolean isArrayFilledWithNullOnly(final T[] elements) {
		if (elements.length == 0) {
			return false;
		}
		boolean nonNull = true;
		for (T element : elements) {
			if (element != null) {
				nonNull = false;
				break;
			}
		}
		return nonNull;
	}

	public static void main(final String[] args) {
		Integer[] myArray = new Integer[] { null, null, null, 5, null };

		System.out.println(isArrayFilledWithNullOnly(myArray));
	}
 
Zuletzt bearbeitet: (Noch erweitert um den Fall array length == 0)
Ich find Tumbleweeds Lösung auch am "normalsten" und würde genau das erwarten in einem Programm. Vor allem weil er noch ne Funktion mit sinnvollem Namen draus gemacht hat (isArrayFilledWithNullOnly)
 
Das ist aber nur die halbe Antwort. Was ist mit dem Fall, dass der Array kein "null" enthält?
Und btw. wer C# programmiert kennt LINQ und weiß es zu schätzen. Der Sinn ist nicht Performance, sondern lesbarkeit. Einem Java-Entwickler bleibt da leider nichts anderes übrig als zu sagen "ist schöner" oder "verständlicher" ohne :D
 
holy schrieb:
Einem !C#-Entwickler bleibt da leider nichts anderes übrig als zu sagen "ist schöner" oder "verständlicher" ohne :D
Ich habe dich mal geringfügig korrigiert. :p

Wenn Linq tatsächlich der Königsweg in C# ist, dann bitte. Ich finde es eher befremdlich und da sowas wohl nur in .Net existiert (man möge mich korrigieren), finde ich die "normale" Lösung an der Stelle auch erwähnenswert. Kann ja auch mal jemand auf den Thread stoßen ohne in .Net zu sitzen.

P.S.: den von dir erwähnten Sonderfall hatte ich kurz vor deinem Beitrag schon reineditiert. :p
 
Meine Antwort war nicht böse gemeint ;)
LINQ ist nicht der Königsweg, aber schon ziemlich elegant.

Das hier
Code:
int count = array.Count( i => i.HasValue );

Würde ich in fast allen Fällen einer normalen Schleife vorziehen und ich finde es wirklich schade, dass Java das nicht kann.
 
Ich würd ja ne Extension Method schreiben:
Code:
public static class ExtensionMethods
{
    public static bool AllElementsNullOrInitialized<T>(this IList<T> list)
    {
        int count = list.Count(x => x == null);

        if ((count == 0) || (count == list.Count))
        {
            return true;
        }

        return false;
    }
}

So kann man das ganze nicht nur für Arrays, sondern für alle möglichen Listen nutzen
Code:
public void DoSomething(int?[] array)
{
    if (!array.AllElementsNullOrInitialized())
    {
        throw new ArgumentException();
    }

    //Do something
}


So unverständlich sieht das doch auch für jemanden der nichts mit C# zu tun hat nicht aus, oder?

Ich meine, dass list.Count(x => x == null) alle Elemente zählt die null sind, da kommt man doch auch drauf ohne jemals was von Lambda Expressions gehört zu haben denke ich.


Edit:
@Tumbleweed
Für den Fall, dass alle Elemente im Array != null sind gibt deine Methode aber false zurück.
Um die Anforderung von palaber zu erfüllen müsste sie aber true liefern.
 
Zuletzt bearbeitet:
Grantig schrieb:
@Tumbleweed
Für den Fall, dass alle Elemente im Array != null sind gibt deine Methode aber false zurück.
Um die Anforderung von palaber zu erfüllen müsste sie aber true liefern.
Meine Methode liefert, was der Methodenname aussagt. Er müsste also die Methode mit ! davor aufrufen.

Abgesehen davon, ist mir auf dem Heimweg klar geworden, warum mir Linq so befremdlich erscheint. Es ist einfach deklarative Programmierung und daran bin ich nicht gewöhnt, weil Java konsistent (zumindest fällt mir kein Gegenbeispiel ein) imperativ ist.
Daher muss man es wohl auf eine Geschmacksfrage runterbrechen, ob einem der deklarative Weg zusagt.

Edit: ach so - Grantig, falls du auf seine zweite Bedingung angespielt hast
alle Elemente des Arrays == "null" || alle Elemente des Arrays == int
die habe ich natürlich (und absichtlich) nicht abgedeckt. Ich wollte nur das Prinzip zeigen, nachdem man auch problemlos den zweiten Check in einer weiteren Methode implementieren kann.
Ich finde deine Lösung übrigens auch elegant. Die Magie passiert eben in Count. Sowas gibts in Java von Hause aus soweit ich weiß nicht.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben