我如何 return 一个包含 1 属性 的列表不被复制?
How can i return a list with 1 property not being duplicated?
我有一种方法可以从数据库中提取州和城市列表。州是独一无二的,但该州可以有许多城市。我的方法目前所做的是 return 每个州和城市对作为一个单独的项目。我需要它做的是拥有一个拥有许多城市的州。
目前 Returns
哦-辛辛那提
哦-克利夫兰
oh-findlay
印第安纳波利斯
我需要什么Return
哦-辛辛那提,克利夫兰,芬德利
印第安纳波利斯
型号
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
}
应该这样做
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)));
[编辑]:再次阅读您的问题后,这可能不是您要找的东西。但是,如果您想要一个仅按州(而不是州和城市)区分的 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<Location> myHashset = new HashSet<Location>(new StateComparer());
我有一种方法可以从数据库中提取州和城市列表。州是独一无二的,但该州可以有许多城市。我的方法目前所做的是 return 每个州和城市对作为一个单独的项目。我需要它做的是拥有一个拥有许多城市的州。
目前 Returns
哦-辛辛那提
哦-克利夫兰
oh-findlay
印第安纳波利斯
我需要什么Return
哦-辛辛那提,克利夫兰,芬德利
印第安纳波利斯
型号
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
}
应该这样做
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)));
[编辑]:再次阅读您的问题后,这可能不是您要找的东西。但是,如果您想要一个仅按州(而不是州和城市)区分的 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<Location> myHashset = new HashSet<Location>(new StateComparer());