相关疑难解决方法(0)

在IEqualityComparer中包装委托

几个Linq.Enumerable函数需要一个IEqualityComparer<T>.是否有一个方便的包装类适应delegate(T,T)=>bool实现IEqualityComparer<T>?编写一个很容易(如果你忽略了定义正确的哈希码的问题),但我想知道是否有开箱即用的解决方案.

具体来说,我想对Dictionarys 进行集合操作,仅使用Keys来定义成员资格(同时根据不同的规则保留值).

.net linq delegates

125
推荐指数
7
解决办法
4万
查看次数

IEqualityComparer为匿名类型

我有这个

 var n = ItemList.Select(s => new { s.Vchr, s.Id, s.Ctr, s.Vendor, s.Description, s.Invoice }).ToList();
 n.AddRange(OtherList.Select(s => new { s.Vchr, s.Id, s.Ctr, s.Vendor, s.Description, s.Invoice }).ToList(););
Run Code Online (Sandbox Code Playgroud)

如果允许,我想这样做

n = n.Distinct((x, y) => x.Vchr == y.Vchr)).ToList();
Run Code Online (Sandbox Code Playgroud)

我尝试使用通用的LambdaComparer,但由于我使用的是匿名类型,因此没有类型与之关联.

"帮助我Obi Wan Kenobi,你是我唯一的希望"

linq lambda anonymous-types iequalitycomparer

33
推荐指数
1
解决办法
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万
查看次数

LINQ OrderBy具有投影比较器的匿名对象

我一直在尝试OrderBy使用LINQ语句来处理匿名对象,但现在已经失败了.

我已经检查了这些:
匿名IComparer实现
C#linq sort - 实例化IComparer的快速方法
如何通过C#中的特定字段对对象数组进行排序?

我花了几个小时尝试不同的方法,但必须有一些我缺少的东西.

假设有以下课程:

public class Product
{
   public int Id {get; set;}
   public string Name {get; set;}
   public int Popularity {get; set;}
   public decimal Price {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

并且products是这些对象的列表.

如何完成此LINQ语句,以便它可以与匿名对象一起使用?
要清楚,我知道我可以用不同的方式做到这一点,但我非常有兴趣学习如何使这个特定的例子有效.

var sortedProducts = products
                       .OrderBy(p => 
                              new {p.Popularity, p.Price}, 
                              [IComparer magic goes here]);
Run Code Online (Sandbox Code Playgroud)

似乎应该可以通过以下方式实现ProjectionComparer:http:
//code.google.com/p/edulinq/source/browse/src/Edulinq/ProjectionComparer.cs?r = 0c583631b709679831c99df2646fc9adb781b2be

任何想法如何做到这一点?

更新:

我对此进行了快速的性能测试 - 匿名比较器解决方案vs标准orderby.thenby,似乎匿名解决方案相当慢,这可能是我们可能预期的.

         numProd  | Anon    | chained orderby clauses
         10 000   | 47 ms …
Run Code Online (Sandbox Code Playgroud)

c# linq icomparer

8
推荐指数
2
解决办法
2427
查看次数