为了账号安全,请及时绑定邮箱和手机立即绑定

使用 foreach 循环提取 List<Class> 中相同编号的前 10 个条目

使用 foreach 循环提取 List<Class> 中相同编号的前 10 个条目

C#
慕哥6287543 2023-07-09 17:44:11
我有一个类型的集合NumberList。public class NumberList{    public int Number { get; set; }    public double Profit { get; set; }    public DateTime CloseTime { get; set; }}所有记录都存储在NumberList中,并按 Number 和 Date 降序排序。现在我需要循环遍历整个列表,搜索有 10 个条目的 Number 并将它们存储在新列表中。我遇到的问题是我得到了 10 个值,但不是相同的数字,比如数字 26724 有 9 个条目,他取下一个 18450 并将其也添加到列表中,因为它缺少 1。它不需要添加其他数字,而是需要重置并tempList继续在下一个数字上,因为它只有 9 个条目。我如何提取相同编号的前 10 个条目并将它们添加到新列表中?这是代码:var tempList = new List<NumberList>(); // temporary listvar finalList = new List<NumberList>(); // new list where we store final resultsforeach (var item in NumberList){    tempList.Add(item); // add numbers to temp list    // if temlist contains Number and number of items in list is less then 10    if (tempList.Contains(item) && tempList.Count() < 10)    {        finalList.Add(item);    }    else    {        if (tempList.Count() == 10) // check for number of items in list        {            tempList.Clear(); // reset tempList        }    }}例如,它需要如何工作:号码 26724 只有 9 个条目,因此他不会出现在新列表中,号码 18450 有 8 个条目,他不会出现在列表中,号码 16822 有 20 个条目,因此我们取出该号码的前 10 个条目并放入在新列表中。26724, -6.55, 18-Jul-19 08:32:3026724, 12.21, 20-Jun-19 03:54:5626724, -6.53, 14-Jun-19 20:09:2826724, 12.15, 31-May-19 17:13:2526724, 0.98, 21-May-19 09:00:0126724, 4.21, 15-May-19 07:02:0226724, -6.56, 08-May-19 18:00:4326724, -7.35, 24-Apr-19 18:40:2526724, -6.59, 04-Apr-19 21:08:4018450, 6.79, 18-Jul-19 22:16:2618450, 6.69, 20-Jun-19 03:31:2718450, 6.82, 14-Jun-19 09:57:1618450, 6.66, 31-May-19 20:27:0518450, -0.28, 13-May-19 15:59:0818450, -5.95, 08-May-19 18:00:0118450, -3.53, 24-Apr-19 12:00:4218450, -6.05, 04-Apr-19 21:00:0316822, 10.38, 11-Jul-19 04:56:2716822, 9.88, 27-Jun-19 09:00:0016822, 0.43, 17-Jun-19 16:00:0216822, -2.36, 11-Jun-19 04:00:0016822, -9.82, 05-Jun-19 20:08:0216822, 13.31, 31-May-19 21:06:2116822, 1.49, 22-May-19 10:00:0216822, -2.8, 17-May-19 12:00:0116822, -8.8, 13-May-19 15:07:4616822, -8.43, 10-May-19 21:49:3116822, -5.84, 03-May-19 16:45:26...... etc
查看完整描述

5 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

现在我需要循环遍历整个列表,搜索有 10 个条目的 Number 并将它们存储在新列表中。


Foeach 不太适合做这项工作。您需要 2 个 For 循环。一个用于每个(不同的)项目编号,一个用于比较。由于您的集合是有序的,因此您可以使用它来避免对基本集合进行多次迭代。每次新系列开始时,您都可以记住内循环的索引结束并在外循环中跳转到记住的位置:


for (int i = 0; i < NumberList.Count; i++)

{

    tempList.Clear();

    for (int j = i+1; j < NumberList.Count; j++)

    {

        if (NumberList[i].Number == NumberList[j].Number)

        {

            tempList.Add(NumberList[i]);                

        }

        else

        {

            // Note that a new series of numbers has began and jump to this position

            i = j;

            break; // end this counting procedure

        }

    }


    // at this point evalueate the counter

    if (tempList.Count >= 10)

    {

        finalList.AddRange(tempList.Take(10));

    }       

}

简短的 Linq 解决方案可能如下所示:


NumberList.GroupBy(x => x.Number).Where(x => x.Count() >= 10).SelectMany(x => x.Take(10));

只需将具有相同值的所有数字收集到分组集合中即可。

然后对其应用过滤器,检查哪一个符合您出现 10 次或以上的标准。

然后仅选择这些项目/取消它们的分组并仅选取前 10 个;


查看完整回答
反对 回复 2023-07-09
?
翻阅古今

TA贡献1780条经验 获得超5个赞

您可以使用 Linq 来执行此操作。例如,

var finalList = numberList
    .GroupBy(a => a.Number)
    .Where(a => a.Count() >= 10)
    .SelectMany(a => a.OrderBy(b => b.CloseTime).Take(10))
    .ToList();

所以首先我们使用 来按数字分组GroupBy。然后,我们使用 限制仅包含 10 个或更多条目的分组Where(a => a.Count() >= 10)。然后我们使用SelectMany来展平分组,并使用 来选择每个分组的前 10 个元素Take,并使用OrderBy来确保它们的顺序一致。


查看完整回答
反对 回复 2023-07-09
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

NumberList
    .GroupBy(x => x.Number)
    .Where(groupings => grouping.Count() > 10) 
    .SelectMany(groupings => groupings)
    .ToList()


查看完整回答
反对 回复 2023-07-09
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

var tempList = new List<NumberList>(); // temporary list
var finalList = tempList.GroupBy(t => t.Number)
            .Where(t => t.Count() >= 10)
            .SelectMany(t => t.Take(10)) //take 10 elements from filtered data
            .ToList();


查看完整回答
反对 回复 2023-07-09
?
四季花海

TA贡献1811条经验 获得超5个赞

您可以在 Number 字段上创建一个不同的值,并使用不同的结果循环该对象


 foreach (var item in numList.Select(x=> x.Number).Distinct())

        {

             int counter = 0;

              if(numList.Where(x=> x.Number.Equals(item)).Count() >= 10 )

              { 

                  foreach( var item2 in numList.Where(x=> x.Number.Equals(item)) ){

                      if(counter <10 ) {

                          finalList.Add(item2);

                          counter ++;

                      }

                  }

              }

        }

        foreach(var test in finalList)

            Console.WriteLine(string.Format("{0}, {1}", test.Number, test.Profit));


查看完整回答
反对 回复 2023-07-09
  • 5 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信