如何使用LINQ Lambda从IEnumberable集合中获取对象?

时间:2015-10-13 05:26:50

标签: c# linq lambda

storageColl正在拥有一个具有财产的IStorage" Id" as"测试"。

我在做什么 -

string id="Test";
IEnumerable<IStorageObject> storageColl = getStorageCollection();
IStorageObject storageObject = storageColl.ToList().Where(m => m.Properties["Id"] == id)
.ToList()
.Cast<IStorageObject>().ToArray()[0];

有没有更好的方法来做到这一点。因为如果storageColl没有那个&#34;测试&#34;这可能会使数组超出绑定异常。

5 个答案:

答案 0 :(得分:4)

您可以在IEnumerable上使用FirstOrDefault

var storageObject = storageCol1.Where(m => m.Properties["Id"] == id).FirstOrDefault();

或者正如David Hedlund指出的那样,在FirstOrDefault上使用谓词重载并删除Where。

var storageObject = storageCol1.FirstOrDefault(m => m.Properties["Id"] == id);

答案 1 :(得分:1)

您的storageColl是一系列实现IStorageObject的对象。使用Where仅限制在枚举序列时获得的元素,它不会更改它们。

当您只需要序列的第一个元素或序列的一个子集时,将序列转换为列表会浪费处理能力。

熟悉以下Ling功能:

  • 如果序列包含至少一个元素
  • ,则Any()返回true
  • 任何(item =&gt; ....)如果序列中的任何元素符合要求
  • ,则返回true
  • First()返回序列的第一个元素。如果不是Any()
  • 则例外
  • FirstOrDefault返回序列的第一个元素或默认值(通常为null),如果不是Any()

关于这些函数的好处是它们不必枚举序列中的所有元素,但一旦找到某些东西就可以停止。

如果使用ToList(),代码将枚举所有元素,将大部分元素抛出并仅使用第一个元素。 FirstOrDefault()在第一次枚举后就会停止。

答案 2 :(得分:0)

您可以通过

简单地实现这一目标
var result = storageColl.Where(m => m.Properties["Id"] == id);

答案 3 :(得分:0)

因为集合是实现IStorageObject你不需要编译它们并且通过索引获取项目你可以使用任何使用Array或IList的类

因为LINQ在IEnumerable上运行(数组本身是可枚举的 - >要迭代),所以你不需要将它们转换为数组。你可以使用ElementAt方法或使用IList类(作为List)

IStorageObject storageObject = storageColl.Where(m => m.Properties["Id"] == id).First();

答案 4 :(得分:0)

您应该检查firstOrDefault因为可以返回null。

var Object = storageCol.Where(p => p.Properties["Id"] == id).FirstOrDefault();

if(Object != null)
{
    // Do some Work
}