Я пытаюсь получить список идентификаторов из списка 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;
}
}
Определите «лучше». Вы можете использовать LINQ .. 'var recieved = objectList.Cast
Он работает? вы получаете какую-либо ошибку? как выглядит ваш 'objectList'? –
@ un-lucky: Он работает, но я ищу лучшую производительность. 'objectList' - это массив' object [] '. Первый элемент каждого 'object []' является целым числом. – TechTotal