将列表中的不同项添加到另一个列表中

时间:2013-04-04 02:19:45

标签: c# list multidimensional-array unique

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

我有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

2 个答案:

答案 0 :(得分:1)

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