Как kronoz сказал в.Net 3.5, который можно использовать Distinct()
.
В.Net 2 Вы могли подражать ему:
public IEnumerable<T> DedupCollection<T> (IEnumerable<T> input)
{
var passedValues = new HashSet<T>();
// Relatively simple dupe check alg used as example
foreach(T item in input)
if(passedValues.Add(item)) // True if item is new
yield return item;
}
Это могло использоваться для дедупликации любого набора и возвратит значения в первоначальном заказе.
Это обычно намного более быстро для фильтрации набора (как и Distinct()
и этот образец делает), чем это должно было бы удалить объекты из него.
Внутренние классы - это, по сути, взлом, введенный в Java 1.1. JVM фактически не имеет понятия о внутреннем классе, поэтому компилятор вынужден его игнорировать. Компилятор генерирует класс B «вне» класса A, но в том же пакете, а затем добавляет к нему синтетические средства доступа / конструкторы, чтобы позволить A получить к нему доступ.
Когда вы даете B защищенный конструктор, A может получить доступ к этому конструктору, поскольку он находится в том же пакете, без необходимости добавления синтетического конструктора.
Доступ класса B
и его конструктор не обязательно должны совпадать. У вас может быть частный внутренний класс с конструктором области пакета, и я обычно это делаю.
public class A {
public A() { b = new B(); }
B b;
private class B {
B() { }
}
}