找到不同的2D数组对

时间:2016-06-30 12:34:12

标签: c# linq

我有这个函数来返回数组的不同元素:

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

但我认为它很好地展示了我正在尝试做的事情。任何指针都会很棒。

2 个答案:

答案 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();