2012-07-04 2 views
1

У меня есть Datatable, в котором мне нужно преобразовать каждую строку в IListLINQ с IList <SelectedItemList> Выпуск

public IList<SelectListItem> _area = new List<SelectListItem>(); 
public IList<SelectListItem> _team = new List<SelectListItem>(); 

    foreach (DataRow row in dt.Rows) 
      { 
     _area.Add(new SelectListItem() { Text = row[1].ToString(), Value = row[1].ToString() }); 
     _team.Add(new SelectListItem() { Text = row[0].ToString(), Value = row[0].ToString() }); 

      } 

данные, которые затем полученный в _area выглядит следующим образом: -

Text      Value 
OMC      OMC 
OMC      OMC 
OMC      OMC 
SIAM      SIAM 
SIAM      SIAM 
SIAM      SIAM      
SIAM      SIAM      
SIAM      SIAM 

Мне нужно использовать LINQ, чтобы получить значения DISTINCT.

Я попытался просто использовать: -

_area.Distinct(); 

Но я оставил 32 записей, которые я начал с ???

+2

SelectedListItem не переопределяет равные, не так ли? – Max

+0

Вам нужно вернуть его обратно в '_area' как' _area = _area.Distinct() ' –

+0

@Max, вы правы, я думаю. Он должен слишком переопределять HashCode – Jodrell

ответ

2
_area.GroupBy(x => x.Value).Select(x => x.Key); 

Это даст вам различные значения областей ...

как насчет как это

_area.GroupBy(x => x.Value).Select(x => x.First()); 

Можете ли вы объяснить лучше, что Отличный, возможно, вы должны переопределить Equals и GetHashCode и таким образом. Он будет работать с Distinct, что-то вроде этого

class Foo 
{ 
    public string Text { get; set; } 
    public string Value { get; set; } 

    public override bool Equals(object obj) 
    { 
     var foo = obj as Foo; 
     if(foo == null) return false; 

     return foo.Text == Text && foo.Value == Value; 
    } 

    public override int GetHashCode() 
    { 
     return Text.GetHashCode() * Value.GetHashCode()^7;  
    } 
} 

, а затем это будет работать, как вы ожидаете (надеюсь)

_area.Distinct(); 
+0

Я не могу это сделать, он не позволит мне ссылаться на x после команды выбора – Derek

+0

обновил ответ, переопределяя Equals и GetHashCode – jjchiw

5

Вы пробовали этот _area = _area.Distinct();

+0

Невозможно преобразовать IEnumerable в Ilist – Derek

+0

Добавьте '.ToList()' в конец. – MarcinJuraszek

+0

Я сделал это, он компилируется, но список все еще находится на 32 входах, его причудливый! – Derek

2

Метод Distinct() принимает paremter типа IEqualityComparer<T> так что в этом случае, вы можете создать компаратор равенства, которое сравнивает два значения два SelectListItems так:

public class SelectListItemComparer : IEqualityComparer<SelectListItem> 
{ 
    public static SelectListItemComparer Instance = new SelectListItemComparer(); 
    private SelectListItemComparer() {} 
    public bool Equals(SelectListItem x, SelectListItem y) 
    { 
     return x.Value.Equals(y.Value); 
    } 

    public int GetHashCode(SelectListItem obj) 
    { 
     return obj.Value.GetHashCode(); 
    } 
} 

Затем вы можете использовать его как это:

var items = new[] 
       { 
        new SelectListItem {Text = "OMC", Value = "OMC"}, 
        new SelectListItem {Text = "OMC", Value = "OMC"}, 
        new SelectListItem {Text = "OMC", Value = "OMC"}, 
        new SelectListItem {Text = "SIAM", Value = "SIAM"}, 
        new SelectListItem {Text = "SIAM", Value = "SIAM"}, 
        new SelectListItem {Text = "SIAM", Value = "SIAM"}, 
        new SelectListItem {Text = "SIAM", Value = "SIAM"}, 
        new SelectListItem {Text = "SIAM", Value = "SIAM"} 
       }; 

var comparer = new SelectListItemComparer(); 
var t1 = items.Distinct(SelectListItemComparer.Instance).ToList(); 

t1 будет содержать только два элемента.

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