问题
Let's say I have two dimensional array that represents simple matrix
int[,] matrix= new int[,] { { 1, 2 }, { 3, 4 }, { 1, 2 }, { 7, 8 } };
It looks like that
1 2
3 4
1 2
7 8
Is there any way to delete duplicate rows using LINQ and make array to look like this?
1 2
3 4
7 8
回答1:
This is not really Linq, but you can define some helper method as if they were Linq methods.
The simpler algorithm should be:
- Convert to a list of list
- Apply a distinct with a custom comparer
- Rebuild another array
This looks like this:
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;
}
}
The custom List comparer (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;
}
}
The usage :
[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();
}
}
回答2:
int[,] list = new int[,] { { 1, 2 }, { 3, 4 }, { 1, 2 }, { 7, 8 } };
List<KeyValuePair<Int32, Int32>> newList = new List<KeyValuePair<int,int>>();
bool dupFound;
for (int i = 0; i < list.Length; i++)
{
dupFound = false;
for (int a = 0; a < list.Length; i++)
{
if ((i != a) && list[a, 0] == list[i, 0] && list[a, 1] == list[i, 1])
{
dupFound = true;
break;
}
}
if (!dupFound)
{
var nonDup = new KeyValuePair<Int32, Int32>(list[i,0], list[i,1]);
newList.Add(nonDup);
}
}
来源:https://stackoverflow.com/questions/19587004/delete-duplicate-rows-from-two-dimentsional-array