我有一个数组字典
public static void Main(string[] args)
{
Dictionary<string, int[]> ret = new Dictionary<string, int[]>();
int[] a = {1,0,3,4,0};
int[] b = { 3, 0, 9, 10, 0};
int[] c = {2,3,3,5,0};
ret.Add("Jack", a);
ret.Add("Jane", b);
ret.Add("James", c);
}
如果我想对v*column count
等列的计数进行操作,我会这样做:
Dictionary<string, double[]> colcnt = ret.ToDictionary(r => r.Key,
r => r.Value.Select(v => v == 0 ? 0 :
(double)v / (ret.Values.Count()) //equation
).ToArray());
执行操作的LINQ代码是什么,例如对非零行进行计数?
如果我使用循环来计算它们,那将是
foreach (var item in ret)
{
int vals= item.Value.Count(s => s != 0);
}
因此,如果我要v/column count
,则a
中的所有项目将被除以3,b
中的所有项目将除以3 c
中的所有项目将除以4
答案 0 :(得分:2)
这是你想要的吗?
var result = ret.ToDictionary
(
r => r.Key,
v => v.Value.Select(n => (double)n/v.Value.Count(i => i != 0)).ToArray()
);
如果该行的所有元素都为零,则会将值设置为NaN
。如果您希望将该行的结果设为零,则可以将代码更改为:
var result = ret.ToDictionary
(
r => r.Key,
v => v.Value.Select(n =>
{
double count = v.Value.Count(i => i != 0);
return (count > 0) ? n/count : 0.0;
}).ToArray()
);
答案 1 :(得分:0)
如果您只需要在所有字典项中使用所有非零值的总和,则可以使用
public static class DictionaryExtensionMethods
{
public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> method)
{
foreach (T obj in enumerable)
{
method(obj);
}
}
}
如果您需要遍历所有键值对并且您不希望使用foreach循环,那么您必须提出自己的扩展方法,如下所示
class Program
{
static void Main()
{
var ret = new Dictionary<string, int[]>();
int[] a = { 1, 0, 3, 4, 0 };
int[] b = { 3, 0, 9, 10, 0 };
int[] c = { 2, 3, 3, 5, 0 };
ret.Add("Jack", a);
ret.Add("Jane", b);
ret.Add("James", c);
ret.ForEach(x => Write(x.Value.Count(y => y !=0), x.Key));
Console.ReadLine();
}
public static void Write(int count, string key)
{
Console.WriteLine("Count of non zeroes in {0} is {1}", key, count);
}
}
你可以像这样使用它
var res = from e2 in list2
join e1 in list1 on e2.name equals e1.name into joined
from j in joined.DefaultIfEmpty()
select new Element
{
name = j.name,
attr = j.attr,
ChildElement = j.ChildElement
};