我正在寻找现实世界的最佳实践,其他人如何实现复杂域的解决方案.
如何使该Distinct()方法使用自定义对象列表(Href在本例中),这是当前对象的样子:
public class Href : IComparable, IComparer<Href>
{
public Uri URL { get; set; }
public UrlType URLType { get; set; }
public Href(Uri url, UrlType urltype)
{
URL = url;
URLType = urltype;
}
#region IComparable Members
public int CompareTo(object obj)
{
if (obj is Href)
{
return URL.ToString().CompareTo((obj as Href).URL.ToString());
}
else
throw new ArgumentException("Wrong data type.");
}
#endregion
#region IComparer<Href> Members
int IComparer<Href>.Compare(Href x, Href y)
{
return string.Compare(x.URL.ToString(), y.URL.ToString());
}
#endregion
}
Run Code Online (Sandbox Code Playgroud) 我正在编写实现IEqualityComparer的这个整洁的类,因此我可以将任何匿名类型传递给它(或实际上任何具有属性的类型),它将通过比较类型的属性值自动比较类型.
public class CompareProperty<T> : IEqualityComparer<T>
{
private Type type;
private PropertyInfo propInfo;
private string _fieldName;
public string fieldName
{
get;
set;
}
public CompareProperty(string fieldName)
{
this.fieldName = fieldName;
}
public bool Equals<T>(T x, T y)
{
if (this.type == null)
{
type = x.GetType();
propInfo = type.GetProperty(fieldName);
}
object objX = propInfo.GetValue(x, null);
object objY = propInfo.GetValue(y, null);
return objX.ToString() == objY.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这是一个很好的小助手功能,我可以多次使用.
为了使用它,我必须这样做:
var t = typeof(CompareProperty<>);
var g = t.MakeGenericType(infoType.GetType());
var c = g.GetConstructor(new …Run Code Online (Sandbox Code Playgroud) 好的,所以我有两个不同类型的项目列表.
var whales = new List<Whale>();
var crabs = new List<Crab>();
Run Code Online (Sandbox Code Playgroud)
所以他们都有id属性.所以保存列表的对象的ID为:
鲸鱼:1,3,4,5只螃蟹:1,2,3,4
好的,我有一个问题:
var matchedPairs = from c in crabs
from w in whales
where c.Id = w.Id
select new { crab = c, whale = w };
Run Code Online (Sandbox Code Playgroud)
这样可以很好地获得比赛.在我遇到麻烦的地方,我想得到一份没有匹配鲸鱼的螃蟹清单,即.Crab Id = 2.然后我想得到没有匹配螃蟹的鲸鱼,即鲸鱼Id = 5.
谁能告诉我如何编写这些查询?
我有两个类型为T的通用列表.两个列表包含相同的类型,我想根据列表2中列表1中不存在的项目创建第三个列表(或列表2的过滤版本)在每个项目的ID上.
每个列表都包含一个"Package"对象,该对象具有ID属性.
现在我使用For Each循环模拟代码,我知道这很糟糕(Big O是恒定的时间)所以我想要一种更有效的方法.
这个代码是按照项目要求的VB,但我更喜欢C# - 所以任何一个代码示例都适合我.
Private Sub RemoveStockPackagesFromSelection()
Dim p As Package
Dim packageList As List(Of Package) = New List(Of Package)
Dim stockPackageList As List(Of Package) = New List(Of Package)
Dim result As List(Of Package) = New List(Of Package)
' Fill list with User's Packages
For i As Integer = 0 To ListBox2.Items.Count - 1
p = New Package
p.Id = CInt(ListBox2.Items(i).Value)
p.Name = ListBox2.Items(i).Text
packageList.Add(p)
Next
' Fill list with Stock Packages to compare:
Dim ds …Run Code Online (Sandbox Code Playgroud) 我试图检查数组列表是否包含反向顺序的数组,如果没有,添加它们:
var faclist = new List<int[]>();
var factors = new int[2] {i, j};
if (!faclist.Contains(factors.Reverse()))
{
faclist.Add(factors);
}
Run Code Online (Sandbox Code Playgroud)
但是,即使存在具有相反因素的数组,此代码也始终不正确.