我想完成标题所说的内容,但我不知道如何去做。
我有2个名单:
public List<int[,]> LongList = new List<int[,]>();
public List<int[,]> UniqueList = new List<int[,]>();
进一步解释,这是一个场景:
困惑:
public int[,] puzzle1 = new int [3,3] { {1,2,3},
{8,4,0},
{7,6,5} }; //[1,2,3;8,4,0;7,6,5]
public int[,] puzzle2 = new int [3,3] { {8,7,6},
{1,0,5},
{2,3,4} }; //[8,7,6;1,0,5;2,3,4]
public int[,] puzzle3 = new int [3,3] { {7,6,3},
{1,0,2},
{8,4,5} }; //[7,6,3;1,0,2;8,4,5]
LongList包含:
LongList.Add(puzzle1);
LongList.Add(puzzle1);
LongList.Add(puzzle1);
LongList.Add(puzzle1);
LongList.Add(puzzle2);
LongList.Add(puzzle2);
LongList.Add(puzzle3);
LongList.Add(puzzle3);
LongList.Add(puzzle3);
我希望Unique列表能够保存LongList中的UNIQUE值。 如果发生这种情况:
UniqueList.Add(puzzle1);
UniqueList.Add(puzzle2);
UniqueList.Add(puzzle3);
作为等式:UniqueList =来自LongList的不同值
列表中包含多个重复出现的值&amp;我想只采用独特的,并将它们放入UniqueList
。
我正在尝试完成一个谜题,而LongList
将包含相同谜题的多个引用等等。为了简化讨论的情况:
LongList
值:1,1,1,1,2,2,3,4,4,4,4,5,5
我希望UniqueList
包含谜题:1,2,3,4,5
答案 0 :(得分:1)
选项1:来自所有多维数组的唯一数字
List<int> UniqueList = new List<int>();
UniqueList = LongList.Select(i => Flatten(i))
.SelectMany(i => i)
.Distinct()
.ToList();
这会将{[[0,1],[2,3]],[[2,2],[4,5]]}变为{0,1,2,3,4,5} < / p>
请参阅下面的Flatten
选项2:按值列出的唯一多维数组
注意:假设每个多维数组匹配的大小和维数。
List<int[,]> UniqueList = new List<int[,]>();
foreach (var e in LongList)
{
IEnumerable<int> flat = Flatten(e);
if (!UniqueList.Any(i => Flatten(i).SequenceEqual(flat)))
{
UniqueList.Add(e);
}
}
这会将{[[[0,1],[2,3]],[[0,1],[2,3]],[[2,2],[4,5]]}转为{[[0,1],[2,3]],[[2,2],[4,5]]}
请参阅下面的Flatten
选项3:仅限唯一参考
UniqueList = aList.Distinct().ToList();
注意:对于评论的背景,这是原始答案。
展平方法
在所有情况下Flatten
取自Guffa's SO Answer
public static IEnumerable<T> Flatten<T>(T[,] items) {
for (int i = 0; i < items.GetLength(0); i++)
for (int j = 0; j < items.GetLength(1); j++)
yield return items[i, j];
}
其他选项
如果OP想要其他内容(例如,平展List<int[,]>
到List<int[]>
或支持不同大小的多维数组),他们将不得不回复。
答案 1 :(得分:1)
根据OP的更新,我们只需要删除重复的引用。因此,我们不需要在每个值的基础上进行比较。 Distinct
应该:
UniqueList = LongList.Distinct().ToList();