比较两个列表<&燃气轮机;关于C#
我的问题是这样的: 但唯一需要注意的是: 我正在使用.NETFramework2.0 那么,如何比较C#framework 2上的两个列表,并在项目不同时返回布尔值呢比较两个列表<&燃气轮机;关于C#,c#,object,arraylist,.net-2.0,C#,Object,Arraylist,.net 2.0,我的问题是这样的: 但唯一需要注意的是: 我正在使用.NETFramework2.0 那么,如何比较C#framework 2上的两个列表,并在项目不同时返回布尔值呢 instance == anotherone fails instance.Equals(anotherone) fails. 编辑: 它们都在列表中 编辑2 我试图比较列表值是否完全相同。我可以对它们进行分类。问题在于项目的计数或值是否发生变化。例如: List1->Item1 = "A" List1->Item
instance == anotherone fails
instance.Equals(anotherone) fails.
编辑:
它们都在列表中
编辑2
我试图比较列表值是否完全相同。我可以对它们进行分类。问题在于项目的计数或值是否发生变化。例如:
List1->Item1 = "A"
List1->Item2 = "B"
List2->Item1 = "B"
List2->Item2 = "A"
//must return true
List1->Item1 = "A"
List1->Item2 = "B"
List2->Item1 = "B"
List2->Item2 = "C"
//must return false
List1->Item1 = "A"
List1->Item2 = "B"
List2->Item1 = "B"
List2->Item2 = "A"
List2->Item3 = "A"
//must return false, etc.
感谢并致以亲切的问候。对于您在计算交叉点时链接到的问题,您需要实现自己版本的
Intersect
。这应该让你开始:
List<T> Intersect<T>(List<T> first, List<T> second) {
Dictionary<T, T> potential = new Dictionary<T, T>();
foreach (var item in first) {
potential.Add(item, item);
}
List<T> intersection = new List<T>();
foreach (var item in second) {
if (potential.Remove(item)) {
intersection.Add(item);
}
}
return intersection;
}
列表相交(先列表,后列表){
字典潜力=新字典();
foreach(第一个变量项){
添加(项目,项目);
}
列表交点=新列表();
foreach(第二个变量项){
如果(潜在移除(项目)){
添加(项目);
}
}
折返交叉口;
}
若要处理具有相同频率的相同项目,请执行以下操作:
bool AreSameAsMultiSets(List<T> first, List<T> second) {
Dictionary<T, int> counts = new Dictionary<T, int>();
foreach (var item in first) {
if (!counts.ContainsKey(item)) {
counts.Add(item, 0);
}
counts[item] = counts[item] + 1;
}
foreach (var item in second) {
if (!counts.ContainsKey(item)) {
return false;
}
counts[item] = counts[item] - 1;
}
foreach (var entry in counts) {
if (entry.Value != 0) {
return false;
}
}
return true;
}
bool是一个多重集合(先列表,后列表){
字典计数=新字典();
foreach(第一个变量项){
如果(!counts.ContainsKey(项目)){
计数。添加(项目,0);
}
计数[项目]=计数[项目]+1;
}
foreach(第二个变量项){
如果(!counts.ContainsKey(项目)){
返回false;
}
计数[项目]=计数[项目]-1;
}
foreach(计数中的var条目){
如果(entry.Value!=0){
返回false;
}
}
返回true;
}
您可能应该在上面添加一些错误处理(第一个不为null,第二个不为null)。请注意,由于您使用的是.NET 2.0,因此不能使用
哈希集。如果要检查列表是否包含相同的项(即相同顺序的相同项):
public static bool ListsEqual(列表1、列表2){
如果(list1.Count!=list2.Count)返回false;
for(int i=0;i
Leandro
您也可以使用我的开源比较.NET对象库。您可以将Config.IgnoreCollectionOrder设置为true
什么类型的?您定义的类实例?信息不够,请写更多的细节。您是否关心列表中项目的顺序,或者如果两个列表包含相同的项目,无论顺序如何,两个列表是否相等?我不关心顺序,因为如果需要进行比较,我可以先对它们进行排序。我在查找是否有任何值被添加和/或删除和/或更新为另一个值。@Leandro:不,不要先排序。你把问题从一个O(n)
复杂性问题变成一个O(n log n)
复杂性问题。我不确定Intersect
是他想要的。@Rawling:他链接的问题是问如何计算交集。请注意,我的第二个方法是ameasmultisets
解决了他关于查看它们是否有相同项目的问题。@Leandro如果这回答了您的问题,您应该单击投票箭头下方的复选标记,选择“为什么要投反对票?”?如果您不解释您认为错误的地方,则无法改进答案。OP指定(不确定是否在您的答案后添加)如果两个列表中的项目顺序不相同,则两个列表相等。为了记录在案,我没有投反对票。对不起,我在答案后指定了“订单详细信息”。我投票赞成,这对我很有用。这个答案可以用:它不是通用的,但我用了它,它很棒。谢谢。
public static bool ListsEqual<T>(List<T> list1, List<T> list2) {
if (list1.Count != list2.Count) return false;
for (int i = 0; i < list1.Count; i++) {
if (list1[i] != list2[i]) return false;
}
return true;
}
[Test]
public void ComparerIgnoreOrderSimpleArraysTest()
{
var a = new String[] { "A", "E", "F" };
var b = new String[] { "A", "c", "d", "F" };
var comparer = new CompareLogic();
comparer.Config.IgnoreCollectionOrder = true;
comparer.Config.MaxDifferences = int.MaxValue;
ComparisonResult result = comparer.Compare(a, b);
Console.WriteLine(result.DifferencesString);
Assert.IsTrue(result.Differences.Where(d => d.Object1Value == "E").Count() == 1);
Assert.IsTrue(result.Differences.Where(d => d.Object2Value == "c").Count() == 1);
Assert.IsTrue(result.Differences.Where(d => d.Object2Value == "d").Count() == 1);
}