1

我想完成标题所述的内容,但我不知道如何去做。

我有 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.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);

我希望唯一列表保存 LongList 中的唯一值。好像这发生了:

UniqueList.Add(puzzle1);
UniqueList.Add(puzzle2);
UniqueList.Add(puzzle3);

作为一个等式:UniqueList = LongList 中的不同值

列表中充满了多个重复出现的值,我只想取唯一的值并将它们放入UniqueList.

我正在尝试完成一个谜题,其中LongList将包含同一个谜题的多个引用等等。为了便于讨论:

LongList值:1,1,1,1,2,2,3,4,4,4,4,5,5

我想UniqueList包含谜题:1,2,3,4,5

4

2 回答 2

2

OP的评论含糊不清。

选项 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 }

见下文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 的 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[]>支持不同大小的多维数组),他们将不得不评论。

于 2013-04-04T02:21:48.000 回答
1

根据 OP 的更新,我们只需要删除重复的引用。所以我们不需要在每个值的基础上进行比较。Distinct应该做:

UniqueList = LongList.Distinct().ToList();
于 2013-04-04T03:09:29.770 回答