3

こんにちは皆さん、これを手伝ってくれませんか。私はいくつかのことを試しました。2つのIEnumerableを検索する必要があります。コードは次のとおりです。

IEnumerable<Project> Projects = new[] { new Project {id = "1", lan = "test1"},  new Project {id = "2", lan = "test1"}}

IEnumerable<string> lan = new [] { "test1", "test2"};
IEnumerable<string> indexFiltered = ?;

lanにProject.lanがあるProject.idを返すlinqクエリを実行する必要があります。

何か案が?

4

5 に答える 5

3

配列ではなくむしろを使用します。HashSetこれにより、O(n)ではなくO(1)としてのcheck-if-contains操作が可能になります。

HashSet<string> lan = new HashSet<string> { "test1", "test2" };
IEnumerable<string> indexFiltered = projects
    .Where(p => lan.Contains(p.lan))
    .Select(p => p.id);
于 2012-11-07T11:55:43.833 に答える
2

どうですか

indexFiltered = Projects.Where(p=>lan.Any(l=>l==p.lan)).Select(p=>p.Id); 
于 2012-11-07T11:53:20.070 に答える
2
 var results = projects.Where(p => lan.Contains(p.lan));
于 2012-11-07T11:54:29.907 に答える
0

私は使用しますIEnumerable.Join()。内部的には、 を使用HashSetして区別を行います。

var Projects = new[] { new {id = "1", lan = "test1"},  new {id = "2", lan = "test1"}};
var lan = new [] { "test1", "test2"};

var results = Projects.Join(lan,
                              project => project.lan,
                              lanName => lanName,
                              (project, lanName) => project.id);

foreach (var result in results)
{
    Console.WriteLine("ID found: ", result);
}
于 2012-11-07T12:08:42.237 に答える
0

別の効率的なアプローチはEnumerable.Join、ハッシュ テーブルとして実装されているため、次を使用することです。

IEnumerable<string> indexFiltered = from p in Projects
                                    join l in lan on p.lan equals l
                                    select p.id;

LINQ JOIN が WHERE でリンクするよりもはるかに高速なのはなぜですか?

Join 演算子は最初のテーブルから行を取得し、次に 2 番目のテーブルから一致するキーを持つ行のみを取得し、次に 3 番目のテーブルから一致するキーを持つ行のみを取得します。

于 2012-11-07T12:03:50.357 に答える