C# 查找二维数组的不同对

C# 查找二维数组的不同对,c#,linq,C#,Linq,我使用此函数返回数组的不同元素: public static object[] Distinct(object[] array) { return array.Select(x => x.ToString()).Distinct().ToArray(); } 我想把它扩展到一个有两列的矩阵,它应该返回不同的对 这显然不起作用: public static object[,] Distinct(object[,] array) { return array.Select(

我使用此函数返回数组的不同元素:

public static object[] Distinct(object[] array)
{
     return array.Select(x => x.ToString()).Distinct().ToArray();
}
我想把它扩展到一个有两列的矩阵,它应该返回不同的对

这显然不起作用:

public static object[,] Distinct(object[,] array)
{
    return array.Select((x,y) => x.ToString(), y.ToString()).Distinct().ToArray();
}

但我认为这很好地说明了我在努力做什么。任何指针都很好。

您可以将2D数组转换为一个
元组序列
,然后在该序列上运行
Distinct
。然后将其转换回二维数组

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;
}
公共静态对象[,]不同(对象[,]数组)
{
var distinct=Enumerable.Range(0,array.GetLength(0))
.Select(i=>Tuple.Create(数组[i,0].ToString(),数组[i,1].ToString())
.Distinct()
.ToList();
var newArray=新对象[distinct.Count,2];
for(int i=0;i

请注意,这是假设数组的第二维度的长度>=2,如果它更大,则只返回前两个位置的值。

最终,您将使用泛型作为扩展方法执行此操作

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;
}

为什么不返回
string[]
string[,]
而不是
object[]
object[,]
?这样就可以清楚地表明,您没有返回传入的原始对象。最好使用<代码> Toistist<代码>,这样您就不必为调用“代码> >计数< /代码>而重复该序列,并且每次调用到代码< EntMatt。也可以考虑通过< <代码> IEqualityComparer < /代码>的版本。当您想要控制它如何比较数组中的项时,可将其设置为
Distinct
int[,] test = new int[,] { { 1, 2 }, { 1, 3 }, { 2, 4 }, { 1, 3 } };
var result = test.Distinct();