1
string sStoreStockFeed = "";
string sSeparator = "";

var distinctStoreIDList = skuStoreStockLevels.Select(x => x.Item1).Distinct();

    foreach (var storeID in distinctStoreIDList)
    {
        foreach (var item in skuStoreStockLevels)
        {
            if (item.Item1 == storeID)
            {
               // add this one to a job for this store
                       sStoreStockFeed += sSeparator + item.Item1.ToString() + "," + item.Item2.ToString() + "," + item.Item3.ToString();
                       sSeparator = "|";
            }
        }
      // some code to process the string before moving on
      sStoreStockFeed = "";
      sSeparator = "";
    }

上記のコードスニペットでは、skuStoreStockLevelsはたまたまタイプTupleのリストであり、Item1はStoreIDです。個別のリストを取得したら、(個別ではない)リストを繰り返して、該当するすべてのアイテムを取得します。非効率なのは、(大きな)内部リストが個別のアイテム(StoreID)ごとに繰り返し繰り返されることです。

4

2 に答える 2

4

更新:純粋なLINQソリューション。これにより、アイテムのグループごとに作成された文字列のリストが表示されます。

var query = skuStoreStockLevel.GroupBy(x => x.Item1)
                .Select(g => g.Aggregate(new StringBuilder(),
                                         (sb, x) => sb.AppendFormat("{0}{1},{2},{3}", sSeparator, x.Item1, x.Item2, x.Item3),
                                         (sb) => sb.ToString()));

foreach(var feed in query)
    // some code to process the string before moving on

他のオプションもあります-シーケンスの順序。等しいアイテムが次々に続きます。

int storeID = -1;
StringBuilder builder = new StringBuilder();

foreach (var item in skuStoreStockLevel.OrderBy(x => x.Item1))
{
    builder.AppendFormat("{0}{1},{2},{3}", sSeparator, item.Item1, item.Item2, item.Item3);
    if (item.Item1 != storeID)
    {
        // some code to process the string before moving on
        storeID = item.Item1;
    }       
}

または、グループ化を使用できます

StringBuilder builder = new StringBuilder();

foreach (var storeGroup in skuStoreStockLevel.GroupBy(x => x.Item1))
{
    foreach (var item in storeGroup)
          builder.AppendFormat("{0}{1},{2},{3}", sSeparator, item.Item1, item.Item2, item.Item3);        

    // some code to process the string before moving on
}

そしてもちろん、StringBuilder文字列の作成に使用することをお勧めします。

于 2012-10-28T21:13:27.907 に答える
1

グループ化されたアイテムのリストを作成するLinqGroupByを使用します。

string sStoreStockFeed = "";
string sSeparator = "";

var itemsByStore = skuStoreStockLevels.GroupBy(x => x.Item1);
foreach (var storeItems in itemsByStore )
{
    // storeItems.Key is the storeId, that is x.Item1
    foreach(var item in storeItems)
    {
        sStoreStockFeed += sSeparator + item.Item1.ToString() + "," + item.Item2.ToString() + "," + item.Item3.ToString();
        sSeparator = "|";
    }

     // some code to process the string before moving on
    sStoreStockFeed = "";
    sSeparator = "";
}
于 2012-10-28T21:16:41.307 に答える