2

C# 中的谓词有一些问题。我有两组代码(我认为这两组代码都应该完成相同的结果),但其中一组永远不会起作用。我问的原因是我需要这个谓词与不同的元素一起出现几次,所以我想尽可能地减少它(非工作的一个非常简单,而另一个包含很多行)。

1 不工作:

ItemViewModel item = (App.ViewModel.All_Items.Where(x => (x as ItemViewModel).Name == my_list_of_strings.ElementAt(2)) as ItemViewModel);

也使用“选择”而不是 Where 不起作用。

2 工作:

foreach (ItemViewModel it in App.ViewModel.All_Items)
{
  if (item.Name == my_list_of_strings.ElementAt(2))
  {
    MessageBox.Show("Success!!");
    item = it;
    continue; // Leave loop
  }
}

我可能忽略了一些愚蠢的事情,但如果有人知道解决方案,那就太好了!

谢谢。

4

1 回答 1

5

IEnumerable<T>.Where(Func<T, bool>)返回一个集合,但是看起来您想要的是单个元素。有几个选项:

IEnumerable<T>.FirstOrDefault(Func<T, bool>) // returns null if no element found
IEnumerable<T>.First(Func<T, bool>) // throws if no element is found

// These throw an error if more than one element exists that matches the query
IEnumerable<T>.SingleOrDefault(Func<T, bool>) // returns null if no element found
IEnumerable<T>.Single(Func<T, bool>) // throws if no element is found

在您的示例中,它将是:

// Just replace "Where" with "FirstOrDefault"
ItemViewModel item = (App.ViewModel.All_Items.FirstOrDefault(x => (x as ItemViewModel).Name == my_list_of_strings.ElementAt(2)) as ItemViewModel);
于 2012-11-24T07:04:46.520 回答