2015-07-28 2 views
0

У меня есть словарь массивовПодсчета ненулевого значения в словаре массивов с помощью LINQ

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

+1

Почему ваш код не достаточен? Вы используете linq довольно хорошо. –

+0

Вы хотите общее количество всех строк или массив строк? –

+0

@MatthewWatson count строк (исключая значения с 0) – ccsv

ответ

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() 
); 
+0

На самом деле не сумма, а счет, поэтому строка a = 3, b = 3, c = 4. Если бы я должен был сделать цикл for через словарь, я бы сделал 'item.Value.Count (s => s! = 0)' – ccsv

+0

Спасибо за настройку 'NaN' – ccsv

0

Если вам просто нужна сумма всех ненулевых значений во всех словарных элементах, которые можно использовать

ret.Sum(x => x.Value.Count(y => y != 0)); 

Если вам нужно перебрать все ключевые пары значений и вы не хотите использовать цикл Еогеасп, то вы должны придумать метод расширения вашей собственной, как показано ниже

public static class DictionaryExtensionMethods 
{ 
    public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> method) 
    { 
     foreach (T obj in enumerable) 
     { 
      method(obj); 
     } 
    } 
} 

и вы можете использовать Это например

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); 
    } 
}