获取唯一项目Azure

时间:2016-02-05 06:54:15

标签: c# linq azure

我有这个名为Matches的Azure模型,我有OrderIdMatchedOrderId这样的

    public String OrderId
    {
        get
        {
            return this.PartitionKey;
        }
        set
        {
            this.PartitionKey = value;
        }
    }

    public String MatchedOrderId
    {
        get
        {
            return this.RowKey;
        }
        set
        {
            this.RowKey = value;
        }
    }

因此,当我有两个订单且匹配时,我在此表中输入两个条目。两个条目是我可以向组织收取他们所拥有的匹配数量。

现在我想显示比赛的数量,之前我一直在做的是像这样获得这个模型中的所有比赛

 public static IEnumerable<Match> GetAll()
 {
    return TableHelper.GetAll<Match>();
 }

但现在我想展示实际比赛。所以我想要展示的只是我创建的两个条目的一个条目。在获得所有匹配之后

List<Match> matches = Matches.GetAll();

Linq查询是否可以提供我想要的内容?

这不是所提到的重复,因为记录是相同的,但这里的条目是不同的。一个例子是,

条目1:

OrderId: "xyz"
MatchedOrderId: "abc"

第2条:

OrderId: "abc"
MatchedOrderId: "xyz"

如果我做了简单的区别,它将无效。

1 个答案:

答案 0 :(得分:1)

您需要Distinct - 具有IEqualityComparer - 重载的方法来定义相等意味着什么:

var result = matches.Distinct(new EqualityComparer());

class EqualityComparer : IEqualityComparer<Matches> {
    public bool Equals(Matches m1, Matches m2) { return m1.OrderId == m2.MatchedOrderId && m2.OrderId == m1.MatchedOrderId ; }
    public int GetHashCode(Matches m) { return 17 * m.OrderId.GetHashCode() + m.MatchOrderId.GetHashCode(); }
}

Equals上实施GetHashCode - 和IEqualityComparer - 方法非常重要。

编辑:显然上面的哈希码并不好,所以我们采用另一个能够处理可交换属性的哈希码:

return m.OrderId.GetHashCode() + m.MatchOrderId.GetHasCode();

我们还需要实现此方法的原因是在对Equals进行任何调用之前比较两个实例时,比较两个实例的哈希码,如果实例可能相等,则作为某种预指示符。当实际检查相等性具有很多逻辑并且包含许多不同属性的比较时,这可能特别有用。进一步阅读this thread