我正在尝试在我的列表stationList
上使用DISTINCT,但似乎我做错了,因为我没有获得不同的列表。我如何在Value
设置stationList
的地方获得不同的内容。
foreach (StationCategory stationCategory in productCatalog.Programming.StationCategory)
{
StringBuilder stationList = new StringBuilder();
foreach (Station station in stationCategory.Station.Distinct())
{
stationList.Append(station.StationName + ",");
}
offer.FeatureList.Add(new Feature() { FeatureName = "<b>" + stationCategory.CategoryName + "</b>", Value = stationList.ToString().TrimEnd(',') });
}
答案 0 :(得分:4)
您当前的代码确实有效,但它采用了不同的对象引用,而不是您期望的名称。为此,您必须告诉代码如何匹配Distinct
。
但是有一个问题,因为Distinct
不接受lambda,所以你不能说'给我不同的电台名称。为了做到这一点,你必须分组,如下例所示:
var ds = stationCategory.Station.GroupBy(s => s.StationName)
.Select(g => g.FirstOrDefault());
ds
现在拥有无数的电台。你可以从中取名。其他属性不保证是唯一的。 (如果您只对名称感兴趣,可以使用此Select
:.Select(g => g.FirstOrDefault()?.StationName);
)
答案 1 :(得分:3)
如果您在Station类中重写Equals方法,则代码将起作用,如下所示
public override bool Equals(object obj)
{
return StationName == ((Station)obj).StationName;
}
否则它会将整个站对象与另一个站对象进行比较,并且会得到不正确的结果。另一种方法是,您可以使用stationCategory.Station.Select(x=>x.StationName).Distinct()
或使用GroupBy
示例:
stationList.Append(string.Join(",",
stationCategory.Station.GroupBy(b=>b.StationName).Select(g=>g.Key).ToArray()));
答案 2 :(得分:0)
我认为这是因为Distinct
函数正在比较对象引用而不是内容,因为这是默认的相等比较器
使用默认的相等比较器来比较值,从序列中返回不同的元素。
https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx
您可以让Station
实施IEqualityComparer<Station>
地址或实施IEqualityComparer
。
答案 3 :(得分:0)
将此代码更新为现有代码:
url="jdbc:sqlserver://SQLDEMOSERVER:1433/geoportal
答案 4 :(得分:0)
.Distinct
检查由GetHashCode
和Equals
方法引起的对象的相等性。如果你没有在Station
类覆盖它,它将永远不会执行正确的过滤。
如果您在GetHashCode
课程中覆盖了Equals
和Station
方法,那么您应该修复它们,因为它们没有返回正确的值。
另一种方法 - 没有覆盖是收集一个List<string>
,其中包含您的电台名称并在其上调用.Distinct
,如下所示:
foreach (StationCategory stationCategory in productCatalog.Programming.StationCategory)
{
var stationList = new List<string>();
foreach (Station station in stationCategory.Station)
{
stationList.Add(station.StationName);
}
offer.FeatureList.Add(new Feature()
{
FeatureName = "<b>" + stationCategory.CategoryName + "</b>",
Value = string.Join(", ", stationList.Distinct())
});
}
答案 5 :(得分:0)
您目前正在使用默认的相等比较器来查找不同的值。
要比较自定义数据类型,您需要实现此接口并为该类型提供自己的GetHashCode和Equals方法。
有关详情和示例,请参阅此处:https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx