Member 11003365 Ответов: 2

Как группировать по arraylist в c#.net


У меня есть arrayList с нижеприведенными данными в виде строки, которая разделена; in c#.net.Я хочу подсчитать тип для каждого идентификатора в специальном datetime как я могу это сделать

ArrayList arrn = new ArrayList();

"1;2017-2-3 08:21:03;type1"
"1;2017-2-4 08:21:03;type1"
"1;2017-2-4 08:21:03;type1"
"2;2017-2-3 08:21:03;type1"
"2;2017-2-3 08:21:03;type1"
"3;2017-2-3 08:21:03;type1"

пожалуйста, помогите мне сгруппироваться по этому arraylist для подсчета типов в специальном datetime для каждого идентификатора

Что я уже пробовал:

Я много искал в интернете, но мне это не удалось

deepankarbhatnagar

Пожалуйста, уточните свой вопрос.

2 Ответов

Рейтинг:
2

OriginalGriff

Лучшие вещи, чтобы сделать:
1) прекратите использовать ArrayList - он был заменен универсальными коллекциями в версии v2 .NET!
2) Создайте класс для хранения значений и дайте ему конструктор, который принимает строку.

Во-первых, разделите каждую строку с помощью string.Расщеплять:
Затем используйте DateTime.Метод tryparseexact, чтобы преобразовать дату в значение DateTime, и intTryParse, чтобы преобразовать код:

private class MyData
            {
            private int _ID;
            public int ID
                {
                get { return _ID; }
                set { _ID = value; }
                }
            private DateTime _Date;
            public DateTime Date
                {
                get { return _Date; }
                set { _Date = value; }
                }
            private string _Type;
            public string Type
                {
                get { return _Type; }
                set { _Type = value; }
                }
            public MyData(string s)
                {
                string[] parts = s.Split(';');
                if (parts.Length != 3) throw new ArgumentException("Not a valid MyData element: " + s);
                if (!int.TryParse(parts[0], out _ID)) throw new ArgumentException("Bad ID Value: " + parts[0]);
                if (!DateTime.TryParseExact(parts[1], "yyyy-M-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out _Date)) throw new ArgumentException("Bad date format: " + parts[1]);
                _Type = parts[2];
                }
            }
Используйте каждую строку для создания нового экземпляра MyData и сохраните их в списке<MyData>
Тогда довольно тривиально использовать запрос Linq (или даже цикл foreach), чтобы получить итоговые данные, сгруппированные по дате, идентификатору или обоим.


Рейтинг:
1

Maciej Los

Вы должны использовать List<T> вместо список ArrayList[^].

Чтобы иметь возможность группировать данные по идентификатору, необходимо создать пользовательский объект, например:

public class MyObject
{
	public int Id {get; set;}
	public DateTime Dt {get; set;}
	public string sType {get; set;}
}


Теперь вы должны создать List<MyObject>, чтобы иметь возможность идти, хотя предметы arrn объект и преобразовать их в список MyObject:
List<MyObject> mydata = new List<MyObject>();

foreach(string x in arrn)
{
    mydata.Add(new MyObject
        {
            Id = Convert.ToInt32(x.Split(new string[]{";"}, StringSplitOptions.RemoveEmptyEntries)[0]),
            Dt = Convert.ToDateTime(x.Split(new string[]{";"}, StringSplitOptions.RemoveEmptyEntries)[1]),
            sType = x.Split(new string[]{";"}, StringSplitOptions.RemoveEmptyEntries)[2]
        });
}


Наконец-то вы готовы к использованию В LINQ[^] для группирования и подсчета данных:
var result = mydata
    .GroupBy(x=>x.Id)
    .Select(grp=> new
        {
            Id = grp.Key,
            Count = grp.Count()
        })
    .ToList();

Результат:
Id Count
1  3 
2  2 
3  1