2

C#の述語に問題があります。私は2セットのコードを持っています(どちらも同じ結果を達成するはずです)が、1つは機能しません。私が尋ねている理由は、この述語が異なる要素で数回表示される必要があるため、可能な限り最小限に抑えたいと考えています(機能しない述語は非常に単純ですが、他の述語には多くの行が含まれています)。

1機能しない:

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

また、Whereが機能していない代わりに「Select」を使用します。

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 に答える