1

コントローラーに List オブジェクトを返す Action メソッドがあります

  Public ActionResult GetCats(long Id,string strsortorder,string dltIds)
  {
      var Result=objrepo.GetCats(Id);//this method returns me List of Result

  }

私の配列は次のようになります。

 var Result=[{CatId:1015,CatName:Abc},{CatId:1016,CatName:Acd},  
{CatId:1017,CatName:Adf},{CatId:1018,CatName:CDdf},{CatId:1019,CatName:asdas},  
{CatId:1020,CatName:Abc},{CatId:1021,CatName:Abc},{CatId:1022,CatName:Abc},  
{CatId:1023,CatName:Abc},{CatId:1024,CatName:Abc}]

私がやりたいことは
、次のようなIDのリストを持つアクションメソッド「strsortorder」と「dltIds」でさらに2つのパラメーターを使用することです。

    strsortorder="1021,1015,1016,1019,1022";
    dltIds="1017,1018,1020";

このメソッドから返された「結果」から、「dltids」にあるレコードを削除し、残りの配列を「strsortorder」にある順序でソートする必要があります。

最終的に、新しいオブジェクトは次のようになります。

var NewResult=[{CatId:1021,CatName:Abc},{CatId:1015,CatName:Abc},  
{CatId:1016,CatName:Acd},{CatId:1019,CatName:asdas},{CatId:1022,CatName:Abc},  
{CatId:1023,CatName:Abc},{CatId:1024,CatName:Abc}]

これをlinqまたは他の方法で達成するのを手伝ってくれる人はいますか?
ここで最大範囲のループまたはフローチを回避したいのですが、ループによって実行できることはわかっていますが、結果に大量のデータが含まれることがあるため、これを回避したいと考えています。

4

1 に答える 1

1

ArrayLista の代わりにan を使用するDictionaryと、より高速になることに気付きました。それがどのように機能するかは明らかだと思いますDictionaryが、配列リストを使用した「より良い」実装は次のとおりです。

 var excludeList = dltIds.Split(",".ToCharArray());
 ArrayList sortList = new ArrayList(strsortorder.Split(",".ToCharArray()));

 var NewResult = 
       Result.Where(item => ! excludeList.Contains(item.CatId.ToString()))
         .OrderBy(item => {
            if (sortList.Contains(item.CatId.ToString()))
              return sortList.IndexOf(item.CatId.ToString());

            return sortList.Count;
         });

以下の元の回答:

Public ActionResult GetCats(long Id,string strsortorder,string dltIds)
{
  var Result=objrepo.GetCats(Id);//this method returns me List of Result

  var excludeList = dltIds.Split(",".ToCharArray());
  int orderCount = 0; // used in the closure creating the Dictionary below
  var sortList = strsortorder.Split(",".ToCharArray())
                             .ToDictionary(x => x,x => orderCount++);

  // filter
  var NewResult = 
        Result.Where(item => ! excludeList.Contains(item.CatId.ToString()))
              .OrderBy(item => {
                 if (sortList.ContainsKey(item.CatId.ToString()))
                   return sortList[item.CatId.ToString()];
                 return sortList.Count();
              });
}

仕組み:

最初に、分割を使用してカンマ区切りの除外リストからリストを作成します。

これは、キーが順序付け ID で、値が 1 ずつ増加する整数であるディクショナリを作成します。

フィルタリングでは、アイテムの処理を続行する前に、アイテムが除外配列に含まれているかどうかを確認します。

次に、キーとディクショナリとの照合で並べ替えを行い、値を返します。値を作成するときにカウンターをインクリメントしたため、リストの順序で並べ替えられます。アイテムがディクショナリにない場合、ディクショナリの最大値よりも 1 つ多い値を返します。これは、アイテムの数でなければなりません。(代わりに の現在の値を使用することもできorderCountました。)

質問?

于 2013-08-01T18:55:43.190 に答える