この方法は私のために働きます:
public class PointCount
{
public CustomPoint Point { get; set; }
public int Count { get; set; }
}
private static IEnumerable<CustomPoint> GetPointsByCount(Dictionary<int, PointCount> pointcount, int count)
{
return pointcount
.Where(p => p.Value.Count == count)
.Select(p => p.Value.Point);
}
private static Dictionary<int, PointCount> GetPointCount(List<CustomPoint> pointList)
{
var allPoints = new Dictionary<int, PointCount>();
foreach (var point in pointList)
{
int hash = point.GetHashCode();
if (allPoints.ContainsKey(hash))
{
allPoints[hash].Count++;
}
else
{
allPoints.Add(hash, new PointCount { Point = point, Count = 1 });
}
}
return allPoints;
}
このように呼ばれます:
static void Main(string[] args)
{
List<CustomPoint> list1 = CreateCustomPointList();
var doubles = GetPointsByCount(GetPointCount(list1), 2);
Console.WriteLine("Doubles:");
foreach (var point in doubles)
{
Console.WriteLine("X: {0}, Y: {1}", point.X, point.Y);
}
}
private static List<CustomPoint> CreateCustomPointList()
{
var result = new List<CustomPoint>();
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
result.Add(new CustomPoint(i, j));
}
}
result.Add(new CustomPoint(1, 3));
result.Add(new CustomPoint(3, 3));
result.Add(new CustomPoint(0, 2));
return result;
}
CustomPoint
実装:
public class CustomPoint
{
public double X { get; set; }
public double Y { get; set; }
public CustomPoint(double x, double y)
{
this.X = x;
this.Y = y;
}
public override bool Equals(object obj)
{
var other = obj as CustomPoint;
if (other == null)
{
return base.Equals(obj);
}
return ((this.X == other.X) && (this.Y == other.Y));
}
public override int GetHashCode()
{
int hash = 23;
hash = hash * 31 + this.X.GetHashCode();
hash = hash * 31 + this.Y.GetHashCode();
return hash;
}
}
それは印刷します:
Doubles:
X: 0, Y: 2
X: 1, Y: 3
X: 3, Y: 3
でわかるように、私は(ハッシュによって)GetPointCount()
一意ごとに辞書を作成します。次に、aから始まるへの参照を含むオブジェクトをCustomPoint
挿入します。同じポイントに遭遇するたびに、が増加します。PointCount
CustomPoint
Count
Count
最後に、辞書のsGetPointsByCount
を返します。ここで、あなたの場合は2です。CustomPoint
PointCount.Count == count
GetHashCode()
また、ポイント(1,2)と(2,1)で同じ結果が返されるため、メソッドを更新したことにも注意してください。それが必要な場合は、独自のハッシュメソッドを自由に復元してください。ただし、2つの数値を1つに一意にハッシュすることは難しいため、ハッシュ関数をテストする必要があります。ただし、使用する数値の範囲によって異なるため、自分のニーズに合ったハッシュ関数を実装する必要があります。