我怎么能返回一个列表与1属性不被复制

本文关键字:属性 复制 列表 一个 返回 怎么能 | 更新日期: 2023-09-27 17:53:20

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

目前回报

哦,辛辛那提

哦,克利夫兰

哦——•芬德雷

——印第安纳波利斯

我需要它返回

哦,辛辛那提,克利夫兰,findlay

——印第安纳波利斯

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

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
    }

我怎么能返回一个列表与1属性不被复制

应该可以了

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)));

[EDIT]:再看一遍你的问题,这可能不是你想要的。但是如果你想要一个只区分州(而不是州和城市)的HashSet,那么可以随意使用:

Quick and dirty:
重写Location的equal和getHashcode方法:

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

更清洁:
使用一个等价比较器:

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());