我有这个函数来返回数组的不同元素:
public static object[] Distinct(object[] array)
{
return array.Select(x => x.ToString()).Distinct().ToArray();
}
我想将它扩展到一个包含2列的矩阵,它应该返回不同的对。
这显然不起作用:
public static object[,] Distinct(object[,] array)
{
return array.Select((x,y) => x.ToString(), y.ToString()).Distinct().ToArray();
}
但我认为它很好地展示了我正在尝试做的事情。任何指针都会很棒。
答案 0 :(得分:3)
您可以将2D数组转换为Tuple
的序列,然后在其上运行Distinct
。然后将其转换回2D数组。
public static object[,] Distinct(object[,] array)
{
var distinct = Enumerable.Range(0, array.GetLength(0))
.Select(i => Tuple.Create(array[i, 0].ToString(), array[i, 1].ToString()))
.Distinct()
.ToList();
var newArray = new object[distinct.Count, 2];
for (int i = 0; i < distinct.Count; i++)
{
newArray[i, 0] = distinct[i].Item1;
newArray[i, 1] = distinct[i].Item2;
}
return newArray;
}
请注意,假设数组的第二个维度的长度为> = 2,如果它大于那么它只返回前两个位置的值。
答案 1 :(得分:1)
最终你会使用泛型吗?
作为扩展方法public static T[,] Distinct<T>(this T[,] array)
{
var result = Enumerable.Range(0, array.GetLength(0))
.Select(i => new { x = array[i, 0], y = array[i, 1] })
.Distinct();
T[,] ret = new T[result.Count(), 2];
for (int i = 0; i < result.Count(); i++)
{
ret[i, 0] = result.ElementAt(i).x;
ret[i, 1] = result.ElementAt(i).y;
}
return ret;
}
所以这是可能的:
int[,] test = new int[,] { { 1, 2 }, { 1, 3 }, { 2, 4 }, { 1, 3 } };
var result = test.Distinct();