如何比较两个无序序列(列表和数组)的相等性?

4

我有一个字符串数组,例如string str[] = {"a", "b"}

还有一个列表List<string> lst = new List<string> {"a", "b"}

我该如何确保字符串数组和列表都包含相同的值?注意:这些值可以以任何顺序出现,但必须具有相同的频率。

有人能告诉我如何在LINQ中实现吗?

谢谢。


它们需要按照相同的顺序吗? - jason
订单和数量是否重要? - Anthony Pegram
@jason 不,它可以是任何顺序。 - Bhaskar
@Bhaskar K:等一下,频率很重要吗? - jason
@Jason 是的。count 应该对于两个都是相同的,并且应该拥有相同的值。 - Bhaskar
如果两个列表完全相同...将列表强制转换为数组或者数组转换为列表不是更简单吗? 像这样:var str = lst.ToArray()和var lst = str.ToList()? - Theun Arbeider
4个回答

13

8
接受的答案对我来说有点奇怪。 为什么不能只这样做:
bool equals = str.OrderBy(s => s).SequenceEquals(lst.OrderBy(t => t));

2

好的,既然顺序不重要而频率重要,你需要计算每个键的数量,并检查产生的键/计数对是否相等:

var first = str.GroupBy(s => s)
               .ToDictionary(g => g.Key, g => g.Count());

var second = lst.GroupBy(s => s)
                .ToDictionary(g => g.Key, g => g.Count());

bool equals = first.OrderBy(kvp => kvp.Key)
                   .SequenceEquals(second.OrderBy(kvp => kvp.Key));

为什么在之后对两个集合进行有序的SequenceEquals时,还要先进行GroupBy呢?我认为可以跳过这一步。 - BrokenGlass

-1

你可以使用 Enumerable.SequenceEqual

  string[] str =new [] {"a", "b"};
  List<string> lst = new List<string> {"a", "b"};
  bool result=str.SequenceEqual(lst);

他说顺序不重要。 - jason
3
好的,我没有看到这个。我正在回答原始问题。我不认为需要因此扣除我的答案。 - Javi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接