我有一个清单:
var list = new List<List<int>>();
Run Code Online (Sandbox Code Playgroud)
哪个可以包含
list[0] = {1, 2, 3, 4}
list[1] = {3, 1, 2, 4}
list[2] = {2, 1, 7, 3}
Run Code Online (Sandbox Code Playgroud)
如何检测[0]和[1]之间的重复并删除其中一个?代码是c-sharp.
实际上它不是一个int,但这不应该改变问题.
可能重复:
比较两个集合是否相等
我需要验证两个IEnumerable<T>列表是否具有相同的元素,不一定是相同的顺序.
我的目标是.NET 3.5.
这是测试.问题是,应该如何HasSameElements()实施?
var l1 = new[]{1,2,3};
var l2 = new[]{3,1,2};
bool rez1 = l1.HasSameElements(l2);//should be true
var l3 = new[]{1,2,3,2};
var l4 = new[]{3,1,2,2};
bool rez2 = l3.HasSameElements(l4);//should be true
var l5 = new[]{1,2,3,2};
var l6 = new[]{1,2,3};
bool rez3 = l5.HasSameElements(l6);//should be false
Run Code Online (Sandbox Code Playgroud)
附加说明:
在示例中,我使用IEnumerable,但T可以是任何东西.T必须实施IComparable吗?
Enumerable.SequenceEquals()本身不起作用,它期望元素的顺序相同.
这是一个模板HasElements:
[只是一些占位符文本作为Markdown'代码格式'错误的解决方法]
public static class Extensions {
public static bool HasElements(this IEnumerable<T> l1, IEnumerable<T> l2){
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud) 这是为两个词典的相等性创建比较器的最佳方法吗?这需要准确.请注意,Entity.Columns是KeyValuePair的字典(字符串,对象):
public class EntityColumnCompare : IEqualityComparer<Entity>
{
public bool Equals(Entity a, Entity b)
{
var aCol = a.Columns.OrderBy(KeyValuePair => KeyValuePair.Key);
var bCol = b.Columns.OrderBy(KeyValuePAir => KeyValuePAir.Key);
if (aCol.SequenceEqual(bCol))
return true;
else
return false;
}
public int GetHashCode(Entity obj)
{
return obj.Columns.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
对GetHashCode实现也不太确定.
谢谢!
我有一个清单.出于正当理由,我多次复制List并将其用于不同目的.在某些时候,我需要检查所有这些集合的内容是否相同.
好吧,我知道怎么做.但作为"短手"编码(linq ...)的粉丝,我想知道我是否能用最短的代码行检查这个效率.
List<string> original, duplicate1, duplicate2, duplicate3, duplicate4
= new List<string();
//...some code.....
bool isequal = duplicate4.sequenceequal(duplicate3)
&& duplicate3.sequenceequal(duplicate2)
&& duplicate2.sequenceequal(duplicate1)
&& duplicate1.sequenceequal(original);//can we do it better than this
Run Code Online (Sandbox Code Playgroud)
UPDATE
Codeinchaos指出了我没有想到的某些语句(重复和列表顺序).虽然sequenceequal会处理重复,但列表的顺序可能是个问题.所以我改变代码如下.我需要复制列表.
List<List<string>> copy = new List<List<int>> { duplicate1, duplicate2,
duplicate3, duplicate4 };
bool iseqaul = (original.All(x => (copy.All(y => y.Remove(x))))
&& copy.All(n => n.Count == 0));
Run Code Online (Sandbox Code Playgroud)
UPDATE2
感谢Eric使用HashSet可以非常有效,如下所示.这不会覆盖重复.
List<HashSet<string>> copy2 =new List<HashSet<string>>{new HashSet<string>(duplicate1),
new HashSet<string>(duplicate2),
new HashSet<string> duplicate3),
new HashSet<string>(duplicate4)};
HashSet<string> origninalhashset = new HashSet<string>(original);
bool eq = copy2.All(x …Run Code Online (Sandbox Code Playgroud) 我有以下实体
public class Employee
{
public int EmpId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何比较对象?谢谢
这两个清单就像
LISTONE "ONE", "TWO", "THREE"
LISTTWO "ONE", "TWO", "THREE"
Run Code Online (Sandbox Code Playgroud)
我需要比较两个列表中的项目是否相同.
在LINQ中有没有办法做到这一点
我一直在执行设定平等(即列表比较,其中的顺序是无关紧要的)和阅读做题等之后尝试这个和这个,写了下面的简单扩展:
public static bool SetEqual<T>(this IEnumerable<T> enumerable, IEnumerable<T> other)
{
if (enumerable == null && other == null)
return true;
if (enumerable == null || other == null)
return false;
var setA = new HashSet<T>(enumerable);
return setA.SetEquals(other);
}
Run Code Online (Sandbox Code Playgroud)
但是,我遇到了一个简单的数据结构,这种方法不起作用,而Enumerable.SequenceEqual则不行.
public class Test : IEquatable<Test>
{
public Guid Id { get; set; }
public List<Test> RelatedTest { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if …Run Code Online (Sandbox Code Playgroud) 我有以下2个对象
List<string> list1
List<string> list2
Run Code Online (Sandbox Code Playgroud)
在列表1上我有3个项目在列表2上我有不同顺序的相同3个项目.
我需要一个简单的方法来返回两个列表相等,当它们包含相同的元素而不管顺序
我试图计算两个像myArray{a,b,c}和的数组urArray{a,b,c,c}
我想检查两个元素是否都有相同的元素,例如在上面的条件中,第二个数组urArray有一个额外的'c'.
如果代码具有相同的元素,则代码应该能够等同两组数组,并且元素的顺序无关紧要.只是两个数组都应该有相同的元素,即如果一个有两个'c',另一个也应该有两个'c',否则条件是假的.
所以我做的是:
char[] myArray = new char[] {'a','b','c','c'};
char[] urArray = new char[] { 'a', 'b', 'c' ,'a'};
List<char> tmp2 = new List<char>(urArray);
for (int i = 0; i < myArray.Length; ++i)
{
for (int j = 0; j < urArray.Length; ++j)
{
if (myArray[i] == urArray[j])
{
Console.WriteLine(urArray[j] + "--> " + "urArray"+" myArray"+"--> "+myArray[i]);
tmp2.Remove(urArray[j]);
urArray = tmp2.ToArray();
}
else if (myArray[i] != urArray[j])
{
Console.WriteLine(myArray[i] + …Run Code Online (Sandbox Code Playgroud) 编辑:
我想要做的就是找到是否db.Id等于xml.Id和db.SubTitle等于xml.SubTitle....等.....我所有的道具
我也尝试过
bool result = db.SequenceEqual(xml) 它一直返回false.
编辑.编辑
我在最终寻求帮助之前做了搜索,我不确定解决问题的最佳方法是什么.
我有两个IList对象,它们都具有完全相同的属性,但数据可能不同.一个对象从db填充,其他对象从xml读取以比较两个源是同步的.
这是我的对象看起来像:
public class EmployeeObject
{
public Int32 Id { get; set; }
public string SubTitle { get; set; }
public string Desc { get; set; }
public bool Active { get; set; }
public string ActiveDateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的:
IList<EmployeeObject> db = Db.EmployeeRepository.PopulateFromDb();
IList<EmployeeObject> xml = Xml.EmployeeRepository.PopulateFromXml();
Run Code Online (Sandbox Code Playgroud)
//到目前为止,这两个对象都填充了数据......
现在比较的时间:
我试过这样的事情:
if ((object)xml == null || ((object)db) == null) …Run Code Online (Sandbox Code Playgroud) c# ×10
linq ×6
equality ×2
list ×2
set ×2
.net ×1
arrays ×1
collections ×1
compare ×1
comparison ×1
dictionary ×1
distinct ×1
generics ×1
lambda ×1
sequence ×1