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;这可能会使数组超出绑定异常。
答案 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功能:
关于这些函数的好处是它们不必枚举序列中的所有元素,但一旦找到某些东西就可以停止。
如果使用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
}