C# 根据列表的不同值迭代列表的有效方法是什么?
在上面的代码片段中,skuStoreStockLevels恰好是一个类型为Tuple的列表,Item1是StoreID。得到一个不同的列表后,它会遍历(非不同的)列表以获得每个适用的项。效率低下的是(大的)内部列表对于每个不同的项目(StoreID)重复迭代。更新:纯LINQ解决方案。这将为您提供为每组项目创建的字符串列表C# 根据列表的不同值迭代列表的有效方法是什么?,c#,linq,C#,Linq,在上面的代码片段中,skuStoreStockLevels恰好是一个类型为Tuple的列表,Item1是StoreID。得到一个不同的列表后,它会遍历(非不同的)列表以获得每个适用的项。效率低下的是(大的)内部列表对于每个不同的项目(StoreID)重复迭代。更新:纯LINQ解决方案。这将为您提供为每组项目创建的字符串列表 string sStoreStockFeed = ""; string sSeparator = ""; var distinctStoreIDList = skuStor
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 = "";
}
另外还有其他选项-顺序排序。相等的项目将依次出现
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
来创建字符串。更新:纯LINQ解决方案。这将为您提供为每组项目创建的字符串列表
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 = "";
}
另外还有其他选项-顺序排序。相等的项目将依次出现
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
来创建字符串。使用Linq,它将为您构建一个分组项目列表:
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
}
使用Linq将为您生成一个分组项目列表:
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
}
制作一个映射
storeID->job
,并在列表中迭代一次。如果storeID
尚未在地图中,请将其与新作业一起添加。否则,为其storeID
,将存储添加到作业中-哦,这看起来很像C#,不是C,所以我重新标记了它。你的助手看起来很奇怪,这是故意的吗。我怀疑以后在sStoreStockFeed中读取结果会非常困难。你可能会得到这样的结果:A,2,3 | A,4,5B,1,2C,3,4 | C,6,7…制作一张地图storeID->job
,并在列表中迭代一次。如果storeID
尚未在地图中,请将其与新作业一起添加。否则,为其storeID
,将存储添加到作业中-哦,这看起来很像C#,不是C,所以我重新标记了它。你的助手看起来很奇怪,这是故意的吗。我怀疑以后在sStoreStockFeed中读取结果会非常困难。你可能会得到这样的结果:A,2,3,A,4,5B,1,2C,3,4,C,6,7。。。