【问题标题】:Filter a list of class with element which starts with specific letters过滤具有以特定字母开头的元素的类列表
【发布时间】:2017-10-24 14:51:12
【问题描述】:

我有一个类对象的列表,我需要使用以这些字母“GHB”开头的元素过滤该列表,然后为其设置一个 listview 控件 dataconext 以显示元素

if(myList.ToList().FindIndex(x=> x.Name !=null)!=-1 )
{
  listview1.DataContext = myList.ToList().where(x=> x.Name.StarstWith("GHB"))
}

但是当元素为空时它会给我一个错误

【问题讨论】:

  • a) 由于大小写问题,代码无法编译。 b) 当您有错误时,请告诉我们。它是什么?它发生在哪里?
  • myList.ToList().FindIndex(x=> x.Name !=null)!=-1 可以更易读地表示为myList.Any(x => x.Name != null)
  • 您是否考虑过在调用方法之前检查x.Name 是否为空?
  • @EdPlunkett 我正在尝试使用 if 条件来做到这一点
  • @DainaHodges 您的 if 条件检查 myList 中是否有任何具有非空名称的项目。因此,如果您有十个项目,其中一个具有非空名称,您继续检查所有名称,包括空名称。我建议调用特定项目的Name上的方法之前,检查你要调用该方法的Name属性是否是空。

标签: c# wpf string linq


【解决方案1】:

它会给你错误,因为你的 if 条件实际上是无用的。检查至少一个元素中的Name 是否不为空,如果是,则尝试访问该变量。这当然会失败,因为您只需要 1 个具有有效名称的元素,其余元素仍然可以具有 null 值,这将导致 NullReferenceException

您可以做的是:在 where 子句中额外检查 Name 是否不为空,如果是,则检查它是否为 StartsWith("GHB")

listview1.DataContext = myList.Where(x => x?.Name != null && x.Name.StartsWith("GHB")).ToList();

这样你就可以保存自己的 if 条件了。

我猜你要检查的是如果所有元素中的Name 不为空。在这种情况下,您可以使用All 方法:

if (myList.All(x=>x.Name != null)

编辑:如果列表中的元素完全是null,则使用? 将避免检查Name

myList.Where(x => x?.Name != null && x.Name.StartsWith("GHB")).ToList();

【讨论】:

  • @mm8 为什么? where 条件中的 && 应确保如果第一部分是 false 则不评估第二部分
  • 非常感谢
  • @MongZhu:对不起,如果 myList 包含空引用,它会引发异常。但是您仍然应该使用 string.IsNullOrEmpty 来验证字符串:)
  • @mm8 我编辑了我的帖子以包含空检查。 IsNullOrEmpty 在这里并不是真正的好人。但它会为您节省 1 个进一步的比较,这是真的
【解决方案2】:

试试这个:

listview1.DataContext = myList
    .Where(x => x != null 
        && !string.IsNullOrEmpty(x.Name) 
        && x.Name.StarstWith("GHB"))
    .ToList();

...并删除if 语句。

【讨论】:

    猜你喜欢
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2011-08-06
    • 2020-02-29
    • 2015-03-02
    • 2012-11-01
    相关资源
    最近更新 更多