List “填充不可变列表”;在一个循环中“;

List “填充不可变列表”;在一个循环中“;,list,f#,cycle,List,F#,Cycle,在我的F#学习过程中,我试图将下面的带列表的C#代码转换为它的F#等价物。我认为很容易理解代码的作用——例如,当NumberOfFileList为[2,2,4,3,1]时,EndFileToOpenList为[2,4,8,11,12]。NumberOfFileList和EndFileToOpenList在代码流的下游都需要。以下是C#代码: List endFilesToOpenList=newlist(); List numberOfFilesList=新列表(); 整数和=0; 对于(int

在我的F#学习过程中,我试图将下面的带列表的C#代码转换为它的F#等价物。我认为很容易理解代码的作用——例如,当NumberOfFileList为[2,2,4,3,1]时,EndFileToOpenList为[2,4,8,11,12]。NumberOfFileList和EndFileToOpenList在代码流的下游都需要。以下是C#代码:

List endFilesToOpenList=newlist();
List numberOfFilesList=新列表();
整数和=0;
对于(int i=0;i<(高-低+1);i++)
{
//myDictionary是Dictionary类型
string myKey=$@“这是一个取决于(低+1)和(低+i)的字符串”;
TryGetValue(myKey,out int值);
numberOfFilesList.Add(值);
总和+=数值;
endFilesToOpenList.Add(总和);
}
虽然在这个C代码段中填充列表看起来非常简单和直接,但我无法在F中找到类似的简单等价物我的问题是:如何将此C代码转换为外观整洁的F代码?

我确实试着用F#编造一些东西。虽然代码可以工作,但似乎非常复杂,尤其是填充endFilesToOpenList的代码。我想一定有更好的办法。我不太好的尝试是:

let getOption j = 
    let i = j + 1  
    let myKey s1 s2 = $@"Here is a string depending on s1 and s2"   
    //myMap is of type Map<string, int>
    match i < (high - low + 1) with  
    | true  ->  
            match myMap.TryGetValue (myKey <| low + 1 <| low + i) with   
            | true, value -> Some(value, i)                                              
            | _  -> None    
    | false -> None  
let numberOfFilesList = List.unfold getOption (-1)
let sumAList list = List.fold(fun acc item -> acc + item) 0 list                                                       
let reducedList i = List.take i numberOfFilesList
let endFilesToOpenList = List.mapi(fun i item -> sumAList (reducedList <| i + 1)) numberOfFilesList 
让getOption j=
设i=j+1
让myKey s1 s2=$@“这是一个取决于s1和s2的字符串”
//myMap属于Map类型
匹配i<(高-低+1)与
|正确->
匹配myMap.TryGetValue(myKey无
|错误->无
让NumberOfFileList=List.unfold-getOption(-1)
让sumAList list=list.fold(趣味acc项目->acc+项目)0列表
让reducedList i=List.take i numberOfFilesList

让endFilesToOpenList=List.mapi(fun i item->sumAList(reducedList这应该可以满足您的需要:

let makeLists (myMap : Map<_, _>) =
    let numberOfFilesList =
        [
            for i = 0 to myMap.Count - 1 do
                match myMap |> Map.tryFind $"key{i}" with
                    | Some value -> yield value
                    | None -> ()
        ]
    let endFilesToOpenList =
        numberOfFilesList
            |> List.scan (+) 0
            |> List.skip 1
    numberOfFilesList, endFilesToOpenList
输出符合您的要求:

numberOfFilesList: [2; 2; 4; 3; 1]
endFilesToOpenList: [2; 4; 8; 11; 12]

这应该满足您的要求:

let makeLists (myMap : Map<_, _>) =
    let numberOfFilesList =
        [
            for i = 0 to myMap.Count - 1 do
                match myMap |> Map.tryFind $"key{i}" with
                    | Some value -> yield value
                    | None -> ()
        ]
    let endFilesToOpenList =
        numberOfFilesList
            |> List.scan (+) 0
            |> List.skip 1
    numberOfFilesList, endFilesToOpenList
输出符合您的要求:

numberOfFilesList: [2; 2; 4; 3; 1]
endFilesToOpenList: [2; 4; 8; 11; 12]

从技术上讲,测试和测试结果中列表的顺序应该颠倒为“let numberOfFilesList,endFilesToOpenList=makeLists myMap”,但每个人都会理解的。谢谢你的概念。这对我来说是个很好的启发。Oops会解决的。从技术上讲,测试和测试结果中列表的顺序应该颠倒过来“let numberOfFileList,endFileToOpenList=makeLists myMap”,但每个人都会理解的。谢谢你的概念。对我来说,这是一个很好的灵感。哦,会解决的。