获取DISTINCT名称

时间:2016-11-11 08:03:30

标签: c# linq distinct

我正在尝试在我的列表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(',') });
    }

6 个答案:

答案 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检查由GetHashCodeEquals方法引起的对象的相等性。如果你没有在Station类覆盖它,它将永远不会执行正确的过滤。

如果您在GetHashCode课程中覆盖了EqualsStation方法,那么您应该修复它们,因为它们没有返回正确的值。

另一种方法 - 没有覆盖是收集一个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