C# 比较2个字符串数组
我想以最快的方式比较两个字符串数组。C# 比较2个字符串数组,c#,data-structures,collections,C#,Data Structures,Collections,我想以最快的方式比较两个字符串数组。 我得到了下面的东西。 这是正确的做法吗。还是有更好的方法 bool matching=false; //say templateArr is the template array and dataArr as array to be compared string[] templateArr = {"Dictionary_type","Translation_EN" };
我得到了下面的东西。
这是正确的做法吗。还是有更好的方法
bool matching=false;
//say templateArr is the template array and dataArr as array to be compared
string[] templateArr = {"Dictionary_type","Translation_EN" };
string[] dataArr = { "Dictionary_type", "Translation_EN" };
if (templateArr.Union(dataArr).Distinct().Count() == templateArr.Count())
matching = true;
您正在创建一个
联合
,然后只使用其中一个来计算总元素数Union
消除了重复,但我不确定这是否是最好的方法,因为这是一个相对昂贵的操作
看看这个替代方案:
string[] templateArr = { "Dictionary_type", "Translation_EN" };
string[] dataArr = { "Dictionary_type", "Translation_EN" };
bool matching = templateArr.Length == dataArr.Length ? !templateArr.Any<string>(x => !dataArr.Contains(x)) : false;
string[]templateArr={“Dictionary\u type”,“Translation\u EN”};
字符串[]dataArr={“Dictionary\u type”,“Translation\u EN”};
布尔匹配=模板阵列长度==数据阵列长度!templateArr.Any(x=>!dataArr.Contains(x)):false;
要测试集合相等性,可以使用以下方法
using System.Linq;
bool AreEqual()
{
string[] templateArr = { "Dictionary_type", "Translation_EN" };
string[] dataArr = { "Dictionary_type", "Translation_EN" };
return templateArr.SequenceEquals(dataArr);
}
bool AreEquivalent()
{
string[] templateArr = { "Dictionary_type", "Translation_EN" };
string[] dataArr = { "Dictionary_type", "Translation_EN" };
return new HashSet<string>(templateArr).SetEquals(dataArr);
}
如果您想测试集合等价性(元素的顺序无关紧要),那么您可以使用如下方法
using System.Linq;
bool AreEqual()
{
string[] templateArr = { "Dictionary_type", "Translation_EN" };
string[] dataArr = { "Dictionary_type", "Translation_EN" };
return templateArr.SequenceEquals(dataArr);
}
bool AreEquivalent()
{
string[] templateArr = { "Dictionary_type", "Translation_EN" };
string[] dataArr = { "Dictionary_type", "Translation_EN" };
return new HashSet<string>(templateArr).SetEquals(dataArr);
}
bool areevalent()
{
string[]templateArr={“Dictionary\u type”,“Translation\u EN”};
字符串[]dataArr={“Dictionary\u type”,“Translation\u EN”};
返回新的HashSet(templateArr).SetEquals(dataArr);
}
根据MSDN文档,这两种情况都是在线性时间内实现的。如果它们具有相同的元素但顺序不同,则假定它们应被视为不相等,您可以使用: 如果要忽略顺序,请先对数组排序:
if (templateArr.OrderBy(x => x).SequenceEqual(dataArr.OrderBy(x => x)))
matching = true;
如果您还想忽略重复项:
if (templateArr.Distinct().OrderBy(x => x).SequenceEqual(dataArr.Distinct().OrderBy(x => x)))
matching = true;
或者(更简洁,可能更快):
根据前面的评论,这个问题有点模棱两可,因为您没有澄清等价数组的组成部分,但是假设在我使用HashSet(array1).SetEquals(array2)之前,如果数组包含相同数量的相同字符串(以任何顺序),您将数组视为相等的 我将尝试使用以下简单技术确定数组是否相等:
对于大型数组,使用这种方法-您可能会发现差异,而不是实际在内存中加载数组,或者依赖哈希设置整个数组,因此获得更高效的性能/内存消耗当您说“比较”时,您的意思是它们必须具有相同的字符串?以你目前的例子,我认为他们是平等的。但是,如果
dataArr
还有一个(比如说,“测试”),结果应该是什么?我认为通过比较它们来澄清你的意思会更有帮助。您想知道它们是否都包含某个元素吗?如果它们有相同数量的条目?如果它们有相同的元素,但顺序不同怎么办?e、 {“Foo”,“Bar”}等同于{“Bar”,“Foo”}吗?我认为这是一个非常好的方法,很容易去~不同的顺序是好的。但是数组元素必须相等,对于大型数组来说性能不是很好-本质上是一个嵌套循环。再说一次,它可能在小型阵列上运行得很好。@BrankoDimitrijevic我明白了,但既然我们正在使用阵列,您有更好的建议吗?反馈将不胜感激。是的,对于更大的数组,事先对数组进行排序或将它们放入哈希集中是合理的。我更喜欢添加这个附加条件,如果(templateArr.Length!=dataArr.Length)matching=false;是的,看起来有点像expensive@sankaras这个条件已经存在,见三元运算符。比我的好得多,+1。但它们应该是bool
而不是void
,对吗?在void方法中,我们不能返回任何内容。
string[] templateArr = { "Dictionary_type", "Translation_EN", "abc" };
string[] dataArr = { "Translation_EN", "Dictionary_type", "Translation_EN" };
if (templateArr.Union(dataArr).Distinct().Count() == templateArr.Count())
matching = true;