2015-10-19 2 views
-2

Я пытаюсь получить список идентификаторов из списка object[]. Вот мой код:Лучший способ получить список int из списка объектов [] в C#

private static List<int> getReceivedIds(object[] objectList) 
{ 
    var received = new List<int>(); 
    foreach (object[] b in objectList) 
    { 
     if (b != null) 
     { 
      received.Add(int.Parse((b[0].ToString()))); 
     } 
    } 
    return received; 
} 

Я ищу оптимальное для работы решение для этого кода.

Я изменил код так:

private static List<int> getReceivedIds2(object[] objectList) 
    { 
     var received = new List<int>(); 
     foreach (object[] b in objectList) 
     { 
      if (b != null) 
      { 
       received.Add((int)b[0]); 
      } 
     } 
     return received; 
    } 

Также я сравнил запрос LINQ и foreach производительности заявление и вот результат: Performance test results

Тест показывает, что foreach утверждение 6 раз быстрее, чем LINQ.

Кто-нибудь может улучшить производительность этого кода?

Вот код для моего теста:

class Program 
{ 
    static void Main(string[] args) 
    { 
     for (int test = 0; test < 100; test++) 
     { 
      object[] objectList = new object[1000]; 
      Random rnd = new Random(); 
      for (int i = 0; i < 1000; i++) 
      { 
       objectList[i] = new object[] { rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000), rnd.Next(1, 10000) }; 
      } 
      Stopwatch stopWatch = new Stopwatch(); 
      stopWatch.Start(); 
      for (int i = 1; i < 100000; i++) 
      { 
       getReceivedIds(objectList); 
      } 
      stopWatch.Stop(); 
      var t1 = stopWatch.Elapsed.TotalMilliseconds; 

      stopWatch.Restart(); 
      for (int i = 1; i < 100000; i++) 
      { 
       getReceivedIds2(objectList); 
      } 
      stopWatch.Stop(); 
      var t2 = stopWatch.Elapsed.TotalMilliseconds; 

      Console.WriteLine(string.Format("LINQ: {0} - ForEach: {1}", t1, t2)); 
     } 
    } 


    private static List<int> getReceivedIds(object[] objectList) 
    { 
     List<int> received = objectList.Cast<object[]>() 
     .Where(b => b != null) 
     .Select(b => (int)b[0]) // or Convert.ToInt32(b[0]) 
     .ToList(); 
     return received; 
    } 

    private static List<int> getReceivedIds2(object[] objectList) 
    { 
     var received = new List<int>(); 
     foreach (object[] b in objectList) 
     { 
      if (b != null) 
      { 
       received.Add((int)b[0]); 
      } 
     } 
     return received; 
    } 
} 
+7

Определите «лучше». Вы можете использовать LINQ .. 'var recieved = objectList.Cast () .Where (b => b! = Null). Выберите (b => int.Parse ((b [0] .ToString()))); '- хотя я бы не решался сказать, что в этом случае лучше. – Rob

+0

Он работает? вы получаете какую-либо ошибку? как выглядит ваш 'objectList'? –

+0

@ un-lucky: Он работает, но я ищу лучшую производительность. 'objectList' - это массив' object [] '. Первый элемент каждого 'object []' является целым числом. – TechTotal

ответ

2

Если первый элемент в object[] на самом деле int вам не нужно разобрать его, вы можете бросить его. Вы можете использовать этот запрос LINQ, если вы хотите:

List<int> received = objectList.Cast<object[]>() 
    .Where(b => b != null) 
    .Select(b => (int)b[0]) // or Convert.ToInt32(b[0]) 
    .ToList(); 
+0

@TechTotal: Я сомневаюсь, что запрос LINQ вызывает разницу в производительности, но ему не нужно преобразовывать строку 'int' в строку и анализировать строку на' int'. –

+0

Я ошибся с лучшей производительностью с LINQ. Ошибка в коде теста производительности. Я дал исправить это. Запрос LING в 6 раз медленнее, чем оператор foreach. Я поставлю тестовый код и результат в разделе вопросов для других. – TechTotal

+0

@TechTotal: это я тоже сомневаюсь. Я думаю, вы измеряете неправильную вещь. Насколько велик ваш 'objectList'? –

1

попробовать это:

int[] resultArray = Array.ConvertAll(inputArray, x => Convert.ToInt32(x)); 

Примечание: Убедитесь, что значения внутр.
Справочно: msdn link for ConvertAll()

Смежные вопросы