【问题标题】:unique LINQ to filter list by variables (case insensitive)唯一的 LINQ 按变量过滤列表(不区分大小写)
【发布时间】:2018-02-19 00:19:28
【问题描述】:

我有

public int practice_example6 (List<Car> cars)

我想通过包含单词"Toyota"Make 过滤此列表,但该过滤器不区分大小写。我的其他条件是SuggestedRetailPrice应该小于30000。

我想我快到了,但对如何处理不区分大小写的问题感到困惑。

if (cars == null)
{
   return 0;
}
else
{
   List<Car> filtered = cars.Where(x => x.Make == "honda").ToList();
   List<Car> filtered2 = cars.Where(x => x.Make == "Honda").ToList();
   List<Car> filtered3 = cars.Where(x => x.SuggestedRetailPrice < 30000).ToList();
}

我也不确定如何在一个返回语句中返回 3 个变量(filtered1,2,3)。也许只是将这 3 个组合成一个变量然后返回?

我是初学者,对此进行了研究。我将不胜感激解释,而不仅仅是修复。

谢谢!

编辑:如果不将函数更改为 IEnumerable practice_example6(List cars),我不应该这样做 - 我知道这将是理想的,但存在限制。

【问题讨论】:

  • 看到最后的规定,我想他们是想让你用FindAll

标签: c# list linq filter case-insensitive


【解决方案1】:

使用不敏感的IndexOf

return cars.Where(x => x.Make.IndexOf("honda", StringComparison.OrdinalIgnoreCase) != -1 ||
                       x.SuggestedRetailPrice < 3000)
           .ToList();

注意,忽略大小写也意味着输入为“honDa”/“hONDA”/“HONDA”等也将被接受


另外,你的函数是public int practice_example6 (List&lt;Car&gt; cars),它返回一个int。您不能以这种方式返回过滤后的列表。将函数更改为返回IEnumerable&lt;Car&gt;Count,具体取决于您的需要:

public int practice_example6(List<Car> cars)
{
    return cars == null ? 0 :
        cars.Count(x => x.Make.IndexOf("honda", StringComparison.OrdinalIgnoreCase) != -1 ||
                        x.SuggestedRetailPrice < 3000);
}

对于连接 3 个集合的一般情况,根据情况使用 ConcatUnion(Union Vs Concat in Linq)

filtered.Concat(filtered2).Concat(filtered3);

【讨论】:

  • 感谢您的精彩解释。不幸的是,我必须使用它编写的函数(这是我正在使用的在线课程)。所以我不能改变这个功能。
  • @William - 现在才看到你想要的是计数,所以无论如何都要更新答案。
【解决方案2】:

你可以试试:

string.Equals(x.Make, "Honda", StringComparison.CurrentCultureIgnoreCase);

类似:

List<Car> filtered = cars.Where(x => string.Equals(x.Make, "Honda", StringComparison.CurrentCultureIgnoreCase)).ToList();

完整方法:

if (cars == null)
{
   return 0;
}
else
{
   return cars.Count(x => string.Equals(x.Make, "Honda", StringComparison.CurrentCultureIgnoreCase) && x.SuggestedRetailPrice < 30000);
}

【讨论】:

  • 这不起作用,因为我无法返回“已过滤”,因为它必须采用 List 形式。
  • 不确定我是否理解.. 你需要返回多少 Car 元素满足过滤条件吗?
  • 是的。它不会让我返回“已过滤”,因为如上所述,您的代码正试图返回一个 int。我想最终返回一个价格低于 30,000 的名为“Honda”(不区分大小写)的汽车列表
  • 感谢您的编辑,我一定遗漏了一些东西。编辑后的代码不起作用,因为我不能使用“ToList();”因为 int 类型没有“ToList”的定义。
  • 确定我在列表中使用了 Count(expression) 扩展方法,以简单地计算满足表达式的项目数。对于表达式本身,我使用 string.Equals() 作为文化不敏感,并将多个条件与逻辑 AND - &&
【解决方案3】:

这个呢?

   List<Car> filtered = cars.Where(x => x.Make.ToLower() == "honda").ToList();

【讨论】:

    猜你喜欢
    • 2016-03-15
    • 2023-04-01
    • 2020-09-23
    • 2012-01-31
    • 2013-03-22
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多