4

.net ゲームに比較的慣れていないので、LINQ の使用と、リスト/コレクションを操作するより伝統的な方法と見なすことができるものとの間の長所/短所を経験した人はいますか?

私が取り組んでいるプロジェクトの特定の例: 一意の ID/名前のペアのリストがリモート Web サービスから取得されています。

  • このリストはめったに変更されません (1 日 1 回)。
  • 使用されているアプリケーションの観点からは読み取り専用になります
  • アクセスするすべてのリクエストに対してアプリケーションレベルで保存されます

これらの点を考慮して、返された値をアプリケーション レベルでシングルトン クラスに格納する予定です。

私の最初のアプローチは、リモート サービスから返されたリストを反復処理し、ID に基づいてコレクションから取得するメソッドを使用して、シングルトン クラスの NameValueCollection に格納することでした。

sugarsoap soapService = new sugarsoap();
branch_summary[] branchList = soapService.getBranches();

foreach (branch_summary aBranch in branchList)
{
    branchNameList.Add(aBranch.id, aBranch.name);
}

LINQ を使用する別の方法は、リストが取得されたら直接リストで動作するメソッドを単純に追加することです。

public string branchName (string branchId) 
{
    //branchList populated in the constructor
    branch_summary bs = from b in branchList where b.id == branchId select b;
    return branch_summary.name;
}

どちらかが他よりも優れています-3番目の方法はありますか? エレガンスを提供するソリューションとパフォーマンスに利益をもたらすソリューションの両方の観点から、両方のアプローチについて、私はすべての答えを受け入れます。

4

4 に答える 4

3

私はあなたが書いたlinqがコンパイルされるとは思わない.

public string branchName (string branchId) 
{
    //branchList populated in the constructor
    branch_summary bs = (from b in branchList where b.id == branchId select b).FirstOrDefault();
    return branch_summary == null ? null : branch_summary.name;
}

.FirstsOrDefault() に注意してください

データにさらに複雑なフィルターを書き込むために、他の場所で使用できるという理由で、LINQ を使用したいと思います。また、NameValueCollection の代替よりも読みやすいと思います。

それは私の $0.02 です

于 2008-09-07T16:07:10.333 に答える
1

一般に、単純な 1 行の for/foreach ループは、Linq を使用するよりも高速です。また、この場合、Linq は[常に]大幅な読みやすさの改善を提供するわけではありません。私がコーディングする一般的なルールは次のとおりです。

アルゴリズムが、Linq を使用せずに記述および保守できるほど単純であり、評価を遅らせる必要がなく Linq が十分な保守性の改善を提供しない場合は、それを使用しないでください。ただし、ここここに投稿した 2 つの例に示すように、Linqによってコードの可読性と正確性が大幅に向上する場合があります。

于 2009-07-15T09:31:21.943 に答える
0

シングルトンクラスが絶対に必要かどうかはわかりませんが、常にグローバルアクセスが絶対に必要ですか?リストは大きいですか?

プロパティを変更する必要がある場合に備えて、シングルトンクラスにrefreshメソッドがあり、リストが変更されたときに更新するようにシングルトンに通知する方法があると仮定します。

どちらのソリューションも実行可能です。LINQは、コンストラクターでコレクションにすばやくデータを入力すると思います(ただし、それほど速くはありません)。従来のコレクションベースのアプローチは問題ありません。個人的には、LINQバージョンを選択するのは、それが新しいテクノロジーであり、それを使用したいという理由だけです。展開環境に.NET3.5が含まれていると仮定します。

Idでブランチを取得するためのメソッドがWebサービスにありますか?ブランチ情報が頻繁に必要とされない場合は、これが3番目のオプションになります。

于 2008-09-07T14:32:02.263 に答える
0

短縮して作業化:

public string BranchName(string branchId) 
{
    var bs = branchList.FirstOrDefault(b => b.Id == branchId);

    return bs == null ? null : bs.Name;
}
于 2012-09-29T11:29:19.000 に答える