亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找實例在列表中出現的次數

查找實例在列表中出現的次數

C#
繁華開滿天機 2023-05-13 16:11:13
我有一個列表,我的目標是確定該列表中的值超過特定值的次數。例如,如果我的列表是: List = {0, 0, 3, 3, 4, 0, 4, 4, 4} 我想知道有兩個實例,我在列表中的值大于 2 并保持在上面2. 所以在這種情況下有 2 個實例,因為它一度低于 2 并再次高于它。    private void Report_GeneratorButton_Click(object sender, EventArgs e)    {        //Lists        var current = _CanDataGraph._DataPoints[CanDataGraph.CurveTag.Current].ToList();        var SOC = _CanDataGraph._DataPoints[CanDataGraph.CurveTag.Soc].ToList();        var highcell = _CanDataGraph._DataPoints[CanDataGraph.CurveTag.HighestCell].ToList();        var lowcell = _CanDataGraph._DataPoints[CanDataGraph.CurveTag.LowestCell].ToList();        //Seperates current list into charging, discharging, and idle        List<double> charging = current.FindAll(i => i > 2);        List<double> discharging = current.FindAll(i => i < -2);        List<double> idle = current.FindAll(i => i < 2 && i > -2);        //High cell        List<double> overcharged = highcell.FindAll(i => i > 3.65);        int ov = overcharged.Count;        if (ov > 1)        {            Console.WriteLine("This Battery has gone over Voltage!");        }        else        {            Console.WriteLine("This battery has never been over Voltage.");        }        //Low cell        List<double> overdischarged = lowcell.FindAll(i => i > 3.65);        int lv = overdischarged.Count;        if (lv > 1)        {            Console.WriteLine("This Battery has been overdischarged!");        }        else        {            Console.WriteLine("This battery has never been overdischarged.");        }        //Each value is 1 second        int chargetime = charging.Count;        int dischargetime = discharging.Count;        int idletime = idle.Count;        Console.WriteLine("Charge time: " + chargetime + "s" + "\n" + "Discharge time: " + dischargetime + "s" + "\n" + "Idle time: " + idletime);    }我當前的代碼是這樣并輸出:    This battery has never been over Voltage.    This battery has never been overdischarged.    Charge time: 271s    Discharge time: 0s    Idle time: 68
查看完整描述

4 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

有很多方法可以解決這個問題;我的建議是將它分解成許多較小的問題,然后編寫一個簡單的方法來解決每個問題。


這是一個更簡單的問題:給定一個序列T,給我返回一個刪除了“雙倍”項目的序列T:


public static IEnumerable<T> RemoveDoubles<T>(

  this IEnumerable<T> items) 

{

  T previous = default(T);

  bool first = true;

  foreach(T item in items)

  {

    if (first || !item.Equals(previous)) yield return item;

    previous = item;

    first = false;

  }

}

偉大的。這有什么幫助?因為現在解決您的問題是:


int count = myList.Select(x => x > 2).RemoveDoubles().Count(x => x);

跟著。


如果您有myListas{0, 0, 3, 3, 4, 0, 4, 4, 4}那么結果Select是{false, false, true, true, true, false, true, true, true}.


的結果RemoveDoubles是{false, true, false, true}。


的結果Count是 2,這是期望的結果。


盡可能使用現成的部件。如果你不能,試著解決一個簡單的、一般的問題,讓你得到你需要的東西;現在您有了一個工具,您可以將其用于需要您刪除序列中重復項的其他任務。


查看完整回答
反對 回復 2023-05-13
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

該解決方案應該可以達到預期的效果。


    List<int> lsNums = new List<int>() {0, 0, 3, 3, 4, 0, 4, 4, 4} ;

    public void MainFoo(){

        int iChange = GetCritcalChangeNum(lsNums, 2);

        Console.WriteLine("Critical change = %d", iChange);

    }

    public int GetCritcalChangeNum(List<int> lisNum, int iCriticalThreshold) { 

        int iCriticalChange = 0;

        int iPrev = 0;

        lisNum.ForEach( (int ele) => { 

            if(iPrev <= iCriticalThreshold && ele > iCriticalThreshold){

                iCriticalChange++;

            }

            iPrev = ele;

        });


        return iCriticalChange;

    }


查看完整回答
反對 回復 2023-05-13
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

您可以創建一個擴展方法,如下所示。


public static class ListExtensions

{

    public static int InstanceCount(this List<double> list, Predicate<double> predicate)

    {

        int instanceCount = 0;

        bool instanceOccurring = false;


        foreach (var item in list)

        {

            if (predicate(item))

            {

                if (!instanceOccurring)

                {

                    instanceCount++;

                    instanceOccurring = true;

                }

            }

            else

            {

                instanceOccurring = false;

            }

        }


        return instanceCount;

    }

}

并像這樣使用您新創建的方法


current.InstanceCount(p => p > 2)


查看完整回答
反對 回復 2023-05-13
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

執行此操作的另一種方法System.Linq是遍歷列表,同時選擇itemitself 和 it's index,然后返回true每一項大于value且前一項小于或等于 的項value,然后選擇結果數true。當然索引有一個特例0,我們不檢查前一項:


public static int GetSpikeCount(List<int> items, int threshold)

{

    return items?

        .Select((item, index) =>

            index == 0

                ? item > threshold

                : item > threshold && items[index - 1] <= threshold)

        .Count(x => x == true)  // '== true' is here for readability, but it's not necessary

           ?? 0;  // return '0' if 'items' is null

}   

示例用法:


private static void Main()

{

    var myList = new List<int> {0, 0, 3, 3, 4, 0, 4, 4, 4};

    var count = GetSpikeCount(myList, 2);

    // count == 2

}


查看完整回答
反對 回復 2023-05-13
  • 4 回答
  • 0 關注
  • 197 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號