2012-10-01 8 views
14

Próbuję zoptymalizować kod dla witryny SharePoint. Mam kontroli powielacz:HashSet jako DataSource

<asp:Repeater ID="CountryOptionsRepeater" runat="server"> 
    <ItemTemplate> 
     <option value='<%#Eval("CountryName") %>'><%#Eval("CountryName") %></option> 
    </ItemTemplate> 
</asp:Repeater> 

jestem wypełnienie go danymi stole

countriesList = countriesList.Distinct<String>().ToList<String>(); 
countriesList.Sort(); 
//var noDupsCountriesList = new HashSet<String>(countriesList); 

DataTable dt = new DataTable(); 
dt.Columns.Add("CountryName"); 

foreach (String countryName in countriesList) 
{ 
    DataRow dr = dt.NewRow(); 
    dr["CountryName"] = countryName; 
    dt.Rows.Add(dr); 
} 

CountryOptionsRepeater.DataSource = dt; 
CountryOptionsRepeater.DataBind(); 
this.DataBind(); 

Czy istnieje sposób, aby bezpośrednio wiążą Hashset obiektu (noDupsCountriesList) do DataSource z tej samej konfiguracji repeatera, w celu doprowadzić do optymalizacji?

Coś jak:

//countriesList = countriesList.Distinct<String>().ToList<String>(); 
//countriesList.Sort(); 
var noDupsCountriesList = new HashSet<String>(countriesList); 

CountryOptionsRepeater.DataMember = "CountryName"; // ?? 
CountryOptionsRepeater.DataSource = noDupsCountriesList; 
CountryOptionsRepeater.DataBind(); 
this.DataBind(); 
+0

dlaczego trzeba DataTable lub HashSet? Czy "CountryOptionsRepeater.DataSource = countriesList;" nie załatwi sprawę? – paul

+0

Możliwe, że będzie możliwe powiązanie bezpośrednio z 'HashSet <>', ale nie dostarczysz krajów posortowanych alfabetycznie, które z twojego kodu wydają się konieczne. – MiMo

+1

@MiMo, dzięki temu dodałbym instrukcję 'OrderBy' (przy założeniu, że HashSet' initializaiton + OrderBy' jest o wiele bardziej zoptymalizowany niż wywołanie List <> 'Distinct() + ToList() + Sort() ') .. – Annie

Odpowiedz

6

Myślę, że ta linia może zastąpić swój drugi blok kodu:

CountryOptionsRepeater.DataSource = 
    countriesList 
    .Distinct() 
    .OrderBy(c => c) 
    .Select(c => new { CountryName = c }) 
    .ToList(); 
+1

To wyrzuca błąd: Nie można znaleźć nazwy kolumny "CountryName". Czy powinienem używać '' w pliku ascx (ponieważ lista nie ma nagłówka kolumny)? – Annie

+1

Element DataMember powinien pozostać pusty, jeśli używany jest typ podstawowy. DataMember ma określać właściwość tego typu. – Shelakel