相关疑难解决方法(0)

使用IEqualityComparer <T>的推荐最佳做法是什么?

我正在寻找现实世界的最佳实践,其他人如何实现复杂域的解决方案.

c# comparison

10
推荐指数
4
解决办法
1万
查看次数

使用Distinct与自定义对象列表

如何使该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)

c# linq list distinct-values

9
推荐指数
1
解决办法
1万
查看次数

实现IEqualityComparer <T>以比较任何类的任意属性(包括匿名)

我正在编写实现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)

c# generics reflection equality iequalitycomparer

4
推荐指数
1
解决办法
5821
查看次数

如何从ID不匹配的两个列表中选择项目

好的,所以我有两个不同类型的项目列表.

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.

谁能告诉我如何编写这些查询?

c# linq

2
推荐指数
1
解决办法
6746
查看次数

.NET Generics - 比较两个列表和过滤器:最佳实践

我有两个类型为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)

.net c# vb.net generics list

1
推荐指数
2
解决办法
7766
查看次数

列表始终不包含数组

我试图检查数组列表是否包含反向顺序的数组,如果没有,添加它们:

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)

但是,即使存在具有相反因素的数组,此代码也始终不正确.

c# arrays list contain

1
推荐指数
1
解决办法
88
查看次数