mehrfaches bestimmen

19/03/2010 - 13:13 von Peter Uhrling | Report spam
Hallo,

ich habe eine Liste von Objekte, alles die gleiche Klasse mit einem
Property vom Typ Integer.
Jeder Integer-wer soll nur einmal vorkommen. Gibt es eien intelligente
Idee, wie ich verhindern kann das bei der Erzeugung der Objekte ein
Wert mehrmals vergeben wird?
Oder wie kann man einfach und schnell ermittel ob ein Wert mehrfach
vorkommt?

Danke
 

Lesen sie die antworten

#1 Stefan Hoffmann
19/03/2010 - 14:02 | Warnen spam
hallo Peter,

On 19.03.2010 13:13, Peter Uhrling wrote:
ich habe eine Liste von Objekte, alles die gleiche Klasse mit einem
Property vom Typ Integer.
Jeder Integer-wer soll nur einmal vorkommen. Gibt es eien intelligente
Idee, wie ich verhindern kann das bei der Erzeugung der Objekte ein Wert
mehrmals vergeben wird?


Ein (Singelton-)Observer wàre dann wohl die richtige, saubere Wahl.

Im Kern siehe Ende des Posts. Allerdings ist dabei u.a. thread-safety
nicht berücksichtigt.

Oder wie kann man einfach und schnell ermittel ob ein Wert mehrfach
vorkommt?


Ermitteln kannst du es am einfachsten mit LINQ, z.B.

List<Class1> l = new List<Class1>();
l.Add(new Class1(1));
l.Add(new Class1(2));
// l.Add(new Class1(2));
l.Add(new Class1(3));
var r = l
.GroupBy(c => c.IntegerField)
.Select(g => new { Key = g.Key, Count = g.Count() });
foreach (var i in r)
{
System.Diagnostics.Debug.WriteLine(i.Key + " - " + i.Count);
}


mfG

using System;
using System.Collections.Generic;
using System.Linq;

namespace TestProject1
{
public class Class1
{
private int integerField;

public Class1()
{
SequenceConstraint.Current().Add(this);
this.IntegerField = -1;
}

public Class1(int integerField)
{
SequenceConstraint.Current().Add(this);
this.IntegerField = integerField;
}

~Class1()
{
SequenceConstraint.Current().Remove(this);
}

public int IntegerField
{
get
{
return this.integerField;
}

set
{
if (this.integerField != value)
{
if (SequenceConstraint.Current().IsValid(value))
{
this.integerField = value;
}
else
{
throw new Exception("Invalid.");
}
}
}
}
}

public sealed class SequenceConstraint
{
private static readonly SequenceConstraint instance new SequenceConstraint();

private List<Class1> list = new List<Class1>();

private SequenceConstraint() { }

public static SequenceConstraint Current()
{
return instance;
}

public void Add(Class1 class1)
{
this.list.Add(class1);
}

public void Remove(Class1 class1)
{
this.list.Remove(class1);
}

public bool IsValid(int integerField)
{
var i = this.list
.Where(p => p.IntegerField == integerField)
.Count();
return i == 0;
}
}
}

Ähnliche fragen