【问题标题】:Add distinct items from a list to another list将列表中的不同项目添加到另一个列表
【发布时间】:2013-03-25 22:52:26
【问题描述】:

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

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

我希望唯一列表保存 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

【问题讨论】:

  • @IsmetAlkan 几乎没有重复
  • 根据他现在给出的列表值,我认为他不需要在这里进行数组比较。
  • 那么uniqueList不应该是List&lt;int&gt;吗?
  • 嗨,马特,感谢您的耐心等待(还有 caerolus)。这种情况不应该出现,所以我认为这不会是一个问题。

标签: c# list multidimensional-array unique


【解决方案1】:

OP 的 cmets 含糊不清。

选项 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();

注意:这是原始答案,用于 cmets 的上下文。

扁平化方法

在所有情况下,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&lt;int[,]&gt; 扁平化为 List&lt;int[]&gt; 或支持不同大小的多维数组),他们将不得不回复。

【讨论】:

  • 取决于您对“独特”的定义。我在 LINQPad 中进行了测试,它符合我的直觉。我将获取代码并回传。
  • 我刚查了一下,没有。
  • 唯一我的意思是:列表将包含值:1,1,1,2,2,2,2,3,3,4,4,4,4,5(为了解释简单因为它们实际上是多维结果)。我只希望 UniqueList 持有:1,2,3,4,5
  • 是的,它执行引用相等,而不是相同的值相等。好的,删除我的答案,因为它不符合 OP 的要求。
  • 我认为您的解释并不简单。它实际上使它复杂化。你能举一个你所追求的多维例子吗?听起来只有所有多维数组中的唯一数字?还是一组只包含每个对应源数组中唯一数字的多维数组?
【解决方案2】:

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

UniqueList = LongList.Distinct().ToList();

【讨论】:

  • 哈哈我的第一个答案...无论如何我都赞成你像我一样耐心地处理这个问题:-)
  • 我只是在考虑它...更新你的并让它成为答案 :-) 顺便说一句...我不确定这是否真的只是参考,或者他只是为了保留这个例子很简单……
  • 根据他的评论,它“包含同一个谜题的多个引用”,您听起来好像对我的解释正确。
  • 不确定,真的。也给你+1,让他决定他的意思:-)
  • 非常感谢大家!如果我要像这样调用唯一列表:UniqueList[0] UniqueList[1] UniqueList[2] 我需要它来抓取拼图 1、拼图 2 和拼图 3(LongList 没有重复).. 这个代码提供那个?
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多