Reputation: 51
I'm trying to dynamically add new records to DataGrid
. I'm using HashSet to prevent duplicates. But when I want to add objects from HashSet
to ObservableCollection
, I get the error:
Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable<>.
I have implemented IEnumerable
.
Constructor in AdminWindow.xaml.cs
class:
public AdminWindow()
{
InitializeComponent();
ObservableCollection<Alert> alertToDataGrid = new ObservableCollection<Alert>();
for (int i = 0; i < Alert.alerts.Count; i++)
{
alertToDataGrid.Add(Alert.alerts[i]); //Here is the issue
}
AlertTable.ItemsSource = alertToDataGrid;
}
Alert
class:
public class Alert : IEnumerable<Alert>
{
private string id;
private DateTime date;
private string email;
private string nameOfAlert;
private string typeOfAlert; // will be enum later
public static HashSet<Alert> alerts = new HashSet<Alert>();
public override string ToString()
{
return id + "\n" + Date+ "\n" + email + "\n" + nameOfAlert + "\n" + typeOfAlert;
}
public override bool Equals(object obj)
{
return obj is Alert alert &&
id == alert.id &&
Id == alert.Id;
}
public override int GetHashCode()
{
return HashCode.Combine(id, Id);
}
// Tried just to return Enumerator
public IEnumerator<Alert> GetEnumerator()
{
foreach (Alert alert in alerts)
{
yield return alert;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public Alert(string id, DateTime date , string email, string nameOfAlert, string typeOfAlert)
{
this.Id = id;
this.Date = date;
this.Email = email;
this.NameOfAlert = nameOfAlert;
this.TypeOfAlert = typeOfAlert;
}
public string Id { get => id; set => id = value; }
public string Email { get => email; set => email = value; }
public string NameOfAlert { get => nameOfAlert; set => nameOfAlert = value; }
public string TypeOfAlert { get => typeOfAlert; set => typeOfAlert = value; }
public DateTime Date { get => date; set => date = value; }
}
Upvotes: 0
Views: 67
Reputation: 474
You could also try
foreach (Alert alert in Alert.alerts) {
alertToDataGrid.Add(alert);
}
See How can I enumerate through a HashSet? for more details
Upvotes: 1
Reputation: 618
As mentioned, you can't use the indexing for a HashSet
. If you're that insistent of using a HashSet
, you can try alertToDataGrid.Add(Alert.alerts.ElementAt(i));
. You'll need to have System.Linq
included.
Upvotes: 1
Reputation: 206
You cannot use []
i.e. indexing operator on HashSet
as it is unordered data structure which does not support indexing. So it is not about DataGrid
but about HashSet
insterad of for
loop please use foreach
loop to iterate over HashSet
or any other IEnumerable
which does not support indexing.
Upvotes: 0