gpt4 book ai didi

c# - 从二维数组中删除重复行

转载 作者:太空狗 更新时间:2023-10-29 23:15:26 29 4
gpt4 key购买 nike

假设我有一个表示简单矩阵的二维数组

int[,] matrix= new int[,] { { 1, 2 }, { 3, 4 }, { 1, 2 }, { 7, 8 } };

好像是这样

1 2
3 4
1 2
7 8

有什么方法可以使用 LINQ 删除重复行并使数组看起来像这样吗?

1 2
3 4
7 8

最佳答案

这不是真正的 Linq,但您可以定义一些辅助方法,就好像它们是 Linq 方法一样。

更简单的算法应该是:

  1. 转换为列表列表
  2. 使用自定义比较器应用独特
  3. 重建另一个数组

看起来像这样:

public static class MyExtensions
{
public static IEnumerable<List<T>> ToEnumerableOfEnumerable<T>(this T[,] array)
{
int rowCount = array.GetLength(0);
int columnCount = array.GetLength(1);

for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
{
var row = new List<T>();
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
{
row.Add(array[rowIndex, columnIndex]);
}
yield return row;
}
}
public static T[,] ToTwoDimensionalArray<T>(this List<List<T>> tuples)
{
var list = tuples.ToList();
T[,] array = null;
for (int rowIndex = 0; rowIndex < list.Count; rowIndex++)
{
var row = list[rowIndex];
if (array == null)
{
array = new T[list.Count, row.Count];
}
for (int columnIndex = 0; columnIndex < row.Count; columnIndex++)
{
array[rowIndex, columnIndex] = row[columnIndex];
}
}
return array;
}
}

自定义列表比较器 (copied from a Jon Skeet's answer) :

public class ListEqualityComparer<T> : IEqualityComparer<List<T>>
{
public bool Equals(List<T> x, List<T> y)
{
return x.SequenceEqual(y);
}

public int GetHashCode(List<T> obj)
{
int hash = 19;
foreach (var o in obj)
{
hash = hash * 31 + o.GetHashCode();
}
return hash;
}
}

用法:

[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var array = new[,] { { 1, 2 }, { 3, 4 }, { 1, 2 }, { 7, 8 } };
array = array.ToEnumerableOfEnumerable()
.Distinct(new ListEqualityComparer<int>())
.ToList()
.ToTwoDimensionalArray();
}
}

关于c# - 从二维数组中删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587004/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com