如何返回一个没有重复的属性的列表?

时间:2015-06-03 12:33:25

标签: c# list unique hashset

我有一个从数据库中提取州和城市列表的方法。州是独一无二的,但该州可能有许多城市。我的方法目前所做的是将每个州和城市对作为单独的项目返回。我需要它做的是拥有许多城市的州。

目前退货

oh-cincinnati

哦 - 克利夫兰

oh- findlay

in-indianapolis

我需要它返回

哦 - 辛辛那提,克利夫兰,芬利

in-indianapolis

MODEL

public class Location
{
    public string State { get; set; }
    public string city { get; set; }

}

REPOSITORY

public HashSet<Location> getlocation()
    {
        HashSet<Location> myHashset = new HashSet<Location>();

        const string storedProc = "someProc";

        dynamic locations;


        using (var conn = DbFactory.myConnection())
        {
            locations = conn.Query(storedProc, commandType: CommandType.StoredProcedure);

        }

        foreach (var location in locations)
        {

                myHashset.Add(new location{State = location.state,City = location.city});


        }
          return myHashset
    }

2 个答案:

答案 0 :(得分:5)

这应该做到

var Result = myHashset.GroupBy(r => r.State)
        .Select(g => new Location
        {
            State = g.Key,
            city = String.Join(", ", g.Select(r => r.city))
        });

也许您不想将其存储到新的Location对象中。我使用字典

更新 - 字典

Dictionary<string,string> Result = myHashset.GroupBy(r => r.State)
.ToDictionary(g => g.Key, g => String.Join(", ", g.Select(r => r.city)));

答案 1 :(得分:0)

[编辑]:再次阅读你的问题后,这可能不是,你在寻找什么。但是如果你想要一个只按State(而不是State和City)区分的HashSet,那么随意使用它:

又快又脏:
覆盖Location&equal和getHashcode方法:

public override bool Equals(Location other)
{
    return this.State.Equals(other.State);
}

public override int GetHashCode()
{
    return this.State.GetHashCode();
}

更干净:
使用IEqualityComparer:

public class StateComparer : IEqualityComparer<Location>
{
    public bool Equals(Location x, Location y)
    {
        if (ReferenceEquals(x, y))
            return true;

        if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
            return false;

        return Equals(x.State, y.State);
    }

    public int GetHashCode(Location obj)
    {
        if (ReferenceEquals(obj, null))
            return 0;

        if (ReferenceEquals(obj.State, null))
            return 0;

        return obj.State.GetHashCode();
    }
}

然后用:

创建HashSet
HashSet<Location> myHashset = new HashSet<Location>(new StateComparer());