【问题标题】:Linq - Take x-amount of distinct items from a listLinq - 从列表中获取 x 数量的不同项目
【发布时间】:2013-12-18 00:58:53
【问题描述】:

我需要使用某个属性显示对象列表中的前 4 个元素。我只想显示前四个“不同”元素。因此,例如,如果我有一个“Car”列表,可以说 Car 对象有一个名为“Color”的属性作为字符串,并且列表看起来像:

  Car: red;
  Car: red;
  Car: blue;
  Car: green;
  Car: green;
  Car: orange;
  Car: purple;

然后我希望代码在这种情况下打印出前四个不同的元素“红、蓝、绿、橙”。

到目前为止,我有一些类似的东西:

  String.Join("," ,cars.Take(4).Distinct().Select(a => String.Format("{0}", a.Color)));

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    尝试拨打Select,然后拨打Distinct,然后拨打Take

    String.Join(",", cars.Select(a => a.Color).Distinct().Take(4)));
    

    另外,string.Join 会为你调用ToString,所以你不需要使用String.Format(除非你真的需要特别格式化字符串)。

    【讨论】:

    • 我道歉,因为我没有让我的例子足够详细。想象一下,我的汽车对象还具有其他属性,这些属性几乎可以使列表与众不同。我最终做的是: String.Join(",", cars.Select(a => a.Color).Distinct().Take(4));不过,您将我引向了我的答案,所以谢谢,我会尽可能接受这个答案。 :)
    • @TMan 我明白了,是的,这会有所作为。我已经相应地更新了我的答案。
    【解决方案2】:

    您需要先获取Distinct,然后再获取Take(4)

    String.Join("," ,cars.Distinct().Take(4).Select(a => String.Format("{0}", a.Color)));
    

    如果您的对象有更多属性,那么您可以这样做:

    String.Join("," ,cars.Select(r=> r.Color).Distinct().Take(4).Select(a =>a.Color));
    

    【讨论】:

      【解决方案3】:

      我认为Distinct() 不适用于没有正确设置相等比较器的汽车。 所以,我猜,正确的答案是:

      cars.Select(x => x.Color).Distinct().Take(4);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-27
        • 2014-05-30
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多