我需要更新IEnumerable列表中的值.
这是一个简短的IEnumerable示例:
IEnumerable<string> allsubdirs = new List<string>() { "a", "b", "c" };
Run Code Online (Sandbox Code Playgroud)
现在,如果我想为每个项添加时间戳,这不起作用:
allsubdirs.Select(a => a = a + "_" + DateTime.Now.ToString("hhmmss")).ToList();
Run Code Online (Sandbox Code Playgroud)
这也不是:
foreach (var item in allsubdirs)
item = item + "_" + DateTime.Now.ToString("hhmmss");
Run Code Online (Sandbox Code Playgroud)
我让它像这样工作:
IEnumerable<string> newallsubdirs = allsubdirs.Select(a => a + "_" + DateTime.Now.ToString("hhmmss")).ToList();
allsubdirs = newallsubdirs;
Run Code Online (Sandbox Code Playgroud)
但这似乎有点像作弊.请问这样做的正确方法是什么?
假设我有一个自定义类:
public class WineCellar
{
public string year;
public string wine;
public double nrbottles;
}
Run Code Online (Sandbox Code Playgroud)
可以说我现在有一个这个自定义类的列表:
List<WineCellar> orignialwinecellar = List<WineCellar>();
Run Code Online (Sandbox Code Playgroud)
包含这些项目:
2012 Chianti 12
2011 Chianti 6
2012 Chardonay 12
2011 Chardonay 6
Run Code Online (Sandbox Code Playgroud)
我知道,如果我想比较两个列表并返回一个新列表,其中只包含不在其他列表中的项目,我会这样做:
var newlist = list1.Except(list2);
Run Code Online (Sandbox Code Playgroud)
如何将其扩展到自定义类?让我们说:
string[] exceptionwinelist = {"Chardonay", "Riesling"};
Run Code Online (Sandbox Code Playgroud)
我想要退回:
List<WineCellar> result = originalwinecellar.wine.Except(exceptionwinelist);
Run Code Online (Sandbox Code Playgroud)
这个伪代码显然不起作用,但希望能说明我想做的事情.然后,该shoudl返回自定义类winecellar的List,其中包含以下项:
2012年基安蒂12
2011年基安蒂6
谢谢.
如何组合两个2d阵列呢?
我的假设(我可以很容易地测试这个)是他们总是有相同数量的列:
let concatArrays (arr1:obj[,]) (arr2:obj[,]) =
([arr1; arr2]) |> Array2d.concat
Run Code Online (Sandbox Code Playgroud)
但这个功能并不存在.为了清楚起见,结果应该产生一个2d数组,其长度=长度和与原始数组2D相同的列数,并且应该与输入的类型相同,这里是obj [,].我显然可以在循环结构中执行此操作,但我想知道f#方式.谢谢.
我试过这个:
let append2D (arr1:float[,]) (arr2:float[,]) =
let cls = arr1.GetLength 1
let rows1 = arr1.GetLength 0
let rows2 = arr2.GetLength 0
Array2D.init (rows1+rows2) cls (fun i j -> match i with | a when a <= rows1 -> arr1.[i,j] | _ -> arr2.[i,j])
Run Code Online (Sandbox Code Playgroud)
但这回来时索引越界错误.
最后一行更新:
Array2D.init (rows1+rows2) cls (fun i j -> if i < rows1 then arr1.[i,j] else arr2.[i,j])
Run Code Online (Sandbox Code Playgroud)
更新工作方案:
Array2D.init (rows1+rows2) cls (fun i j …Run Code Online (Sandbox Code Playgroud) 我发现自己在linq语句中重复计算,我想知道我是否可以某种方式访问已经计算过的元素.这就是我在做的事情:
var result = testdata.GroupBy(a => new { a.reportinggroup, a.commodity, a.timestep.Year })
.Select(g => new EndResult
{
rundate = rundate.ToShortDateString(),
price = g.Sum(a => (a.timestep.ispeak()) ? a.price : 0) / g.Sum(a => (a.timestep.ispeak()) ? 1 : 0),
valueposition = g.Sum(a => (a.timestep.ispeak()) ? a.position * a.price : 0) / (g.Sum(a => (a.timestep.ispeak()) ? a.price : 0) / g.Sum(a => (a.timestep.ispeak()) ? 1 : 0)),
}).ToList();
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
这就是我想要做的事情:
var result = testdata.GroupBy(a => new { a.reportinggroup, a.commodity, a.timestep.Year })
.Select(g => …Run Code Online (Sandbox Code Playgroud) 我有一个功能,我使用了很多,因此性能需要尽可能好.它从excel获取数据,然后根据数据是否在一定时间内以及是否为高峰时段(Mo-Fr 8-20)对数据的部分进行求和,平均或计数.
数据通常约为30,000行和2列(每小时日期,值).数据的一个重要特征是日期列按时间顺序排列
我有三个实现,c#使用扩展方法(死慢,除非有人感兴趣,否则我不会显示它).
然后我有这个f#实现:
let ispeak dts =
let newdts = DateTime.FromOADate dts
match newdts.DayOfWeek, newdts.Hour with
| DayOfWeek.Saturday, _ | DayOfWeek.Sunday, _ -> false
| _, h when h >= 8 && h < 20 -> true
| _ -> false
let internal isbetween a std edd =
match a with
| r when r >= std && r < edd+1. -> true
| _ -> false
[<ExcelFunction(Name="aggrF")>]
let aggrF (data:float[]) (data2:float[]) std edd pob sac =
let …Run Code Online (Sandbox Code Playgroud) 我试图使用对象处理程序,我有这个工作正常,把东西放在内存中.但当我再次查看对象时,我会回复:
object(object[,])
Run Code Online (Sandbox Code Playgroud)
要么
object(double[,])
Run Code Online (Sandbox Code Playgroud)
如何在c#中取消装箱?
object(double[,]) boxedobj = ....
double[,] unboxedobj = unbox(boxedobj);
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想以通用方式执行此操作,以便无论tybe是double []还是double [,]或object [,]等都无关紧要
我试图创建一个数组,它由一个输入数组(长度= N)和相同的数组以相反的顺序组成,因此输出数组是长度(2N).就像输入= {1,2,3}然后输出= {1,2,3,3,2,1}
这是我试过的:
public static double[] stack(double[] input)
{
int N = input.Length;
var z = new double[2 * N];
input.CopyTo(z, 0);
Array.Reverse(input).CopyTo(z, N);
return z;
}
Run Code Online (Sandbox Code Playgroud)
但这会引发错误(操作符不能应用于void类型).我哪里出错了?这是最快的方法吗?
我有一个自定义类的列表,其中包含double,string等类型的各种变量.
为了使用Excel DNA将其返回到excel,我需要将列表转换为object[,].
这是我做的,但有更好的方法吗?如果我添加另一个变量,我需要记住重做列数等.
List<customclass> BMrep = somefunction();
var retdata = new object[BMrep.Count,22];
for (int i = 0; i < BMrep.Count; i++)
{
retdata[i, 0] = BMrep[i].product_code;
retdata[i, 1] = BMrep[i].RG;
...
}
return retdata;
Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用了double.parse,现在发现了其他用户遇到问题的问题.
我应该用过:
double.parse(string, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
到处.
我可以更改行为double.parse或者我是否真的需要去代码中的所有位置并手动执行此操作?
我希望获得具有特定扩展名但跳过某些文件夹的所有文件的所有路径.我使用此代码工作正常,但不排除指定的文件夹.
public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOpt)
{
try
{
var dirFiles = Enumerable.Empty<string>();
if (searchOpt == SearchOption.AllDirectories)
{
dirFiles = Directory.EnumerateDirectories(path)
.Where(y => !y.Contains("Program Files") || !y.Contains("Windows"))
.SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt));
}
return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern));
}
catch (UnauthorizedAccessException ex)
{
return Enumerable.Empty<string>();
}
}
Run Code Online (Sandbox Code Playgroud)
但根据我对其他问题的研究,这正是我应该做的.我哪里出错了?
用法是:
var enumerable = EnumerateFiles(@"C:\", "*.jpg", SearchOption.AllDirectories);
Run Code Online (Sandbox Code Playgroud)