【问题标题】:Find item in IList with LINQ使用 LINQ 在 IList 中查找项目
【发布时间】:2013-02-23 05:58:14
【问题描述】:

我有一个 IList:

IList list = CallMyMethodToGetIList();

我不知道我能得到它的类型

Type entityType = list[0].GetType();`

我想用 LINQ 搜索这个列表:

var itemFind = list.SingleOrDefault(MyCondition....);

感谢您的帮助。

【问题讨论】:

  • 如果您不知道类型,您的病情会是什么样子?
  • 由于您使用的是非泛型IList,因此您需要在使用其他LINQ 方法之前添加.OfType<T>.Cast<T>。如果您的项目不属于同一类型,您可以简单地将object 用作T,即.OfType<object>()
  • 如果您知道该类型派生自接口,请强制转换为该接口并使用接口方法。如果您知道该类型实现了特定方法,请尝试使用 dynamic。
  • @lazyberezovsky 写这样一个条件并不难,它只是想出一个有用的条件,可能容易也可能不容易。例如,任何类型都会有一个ToString,你可以判断obj.ToString()是否为null。
  • 您知道SingleOrDefault 会在找到多个项目时抛出异常,是吗?在这种情况下,“单身”并不意味着“只给我一个”。如果您打算“只给我一个”,那么在提供的答案中使用FirstOrDefault

标签: c# .net linq list


【解决方案1】:

简单:

IList list = MyIListMethod();

var item = list
    .Cast<object>()
    .SingleOrDefault(i => i is MyType);

或:

IList list = MyIListMethod();

var item = list
    .Cast<object>()
    .SingleOrDefault(i => i != null);

希望对您有所帮助!

【讨论】:

  • OfType&lt;MyType&gt;() 会为你做这件事。
  • 基本上分别是foreach(item) yield return (T)itemforeach(item) if (item is T) yield return item as T
  • 如果类型是不可为空的值类型怎么办?
  • .SingleOrDefault(xxx) 中的过滤器仅作为示例。我的意思是.Cast&lt;object&gt;() 方法。 ...但你的问题很有趣!给我几分钟...
  • 最简单的方法,在一个泛型方法中,像这样:link
【解决方案2】:
IList list = ...

// if all items are of given type
IEnumerable<YourType> seq = list.Cast<YourType>().Where(condition);

// if only some of them    
IEnumerable<YourType> seq = list.OfType<YourType>().Where(condition);

【讨论】:

  • 我的印象是在编译时该类型是未知的,因为他使用list[0].GetType() 来获取类型。我同意您对我的回答的评论,即dynamic 效率不高,但它支持 Linq。
猜你喜欢
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
相关资源
最近更新 更多