1

C# (3.5) でリストをフィルタリングするための最良の方法を見つけようとしていますが、私の状況に似た例が見つからないようです。私はラムダまたはlinqを使用することにオープンです。

私が見つけたほとんどの例と比較してユニークなことは、私のリスト項目にはそれぞれ子配列があることです...

var employees= new List<Employee>
{
    new Employee{Name = "John",Nicknames="'J','Big J','Big John'"},
    new Employee{Name = "Joshua",Nicknames="'J','Josh','Joshman'"},
}

次に、そのリストを次のようにフィルタリングしたいと思います...

//using linq
var matchesByNickname =
from worker in employees
where worker.Nicknames.Equals("J")
select worker;

//or lambda
var employees2 = employees
    .Where(e => Nicknames.Exists(n => n.Nickname == "J"))

しかしもちろん、Nicknames 自体は配列なので、.Equals や .Contains などは使用できません。このタイプのリストをフィルタリングする最善の方法は何でしょうか?

更新: 私の例を単純に保つために、私はあなたを少し誤解させました。リスト項目には、文字列ではなく、真のオブジェクト配列があります。私の実際の例は、カスタム製品オブジェクトのリストです。製品オブジェクトには、Region オブジェクトのリストである Regions プロパティがあります。製品には、リージョンをまったく持たないことも、1 つまたは複数持つこともできます。領域オブジェクトには名前と ID があります。したがって、私が本当に望んでいるのは、特定の地域に割り当てられた製品について、製品のリストをフィルタリングすることです。

4

2 に答える 2

3

あなたの例でNicknameは、配列ではありません。文字列です。文字列の配列であると仮定すると、次のことができます。

var employees2 = employees.Where(e => e.Nicknames.Contains(name));

そのまま (文字列) に保持したい場合は、次の行に沿って何かを試すことができます。

var employees2 = employees.Where(e => e.Nicknames.Split(',')
                                                 .Contains("'" + name + "'"));

上記のどちらの場合でも、 (は 2.0 から使用されていますが、3.5 で新しく追加されました)の代わりに、 に置き換えWhereFindAll結果を取得できます。List<T>IEnumerable<T>List<T>.FindAllEnumerable.Where

もちろん、理想的には、次のような配列またはリストにして、最初の方法を使用します。

var employees = new List<Employee>
{
    new Employee{Name = "John",Nicknames= new [] {"J", "Big J", "Big John"}},
    new Employee{Name = "Joshua",Nicknames = new [] {"J", "Josh", "Joshman"}},
};

更新:実際の例は、このサンプルケースとそれほど違いはありません。オブジェクト全体ではなく、プロパティをチェックしているので、代わりに探していると思います。AnyContains

var filteredProducts = products
        .Where(p => p.Regions.Any(r => r.Name == "regionToSearchFor"));
于 2010-01-21T17:46:46.003 に答える
0

ニックネームを一重引用符で囲んでいる場合は、一重引用符で囲まれた名前の文字列を確認できます。

employees.Where(x=>x.Nicknames.IndexOf("'J'") >= 0)

編集:一重引用符を忘れました...そして> =

于 2010-01-21T17:54:37.847 に答える