Не привязывать повторяющиеся элементы к отмеченному списку

У меня есть список объектов, в которых есть информация о команде продавцов. в списке есть несколько команд с одинаковым названием, но с другим продавцом.

класс teamDetails имеет следующие атрибуты:

string teamName;
string region;
int teamSales;
string salesmanFullName;
string salesmanAddress;

у пользователя есть возможность найти все команды, продажи которых превышают определенное значение. затем эти команды добавляются в список флажков.

вот как я заполняю список флажков:

var viewList = from toSearch in GlobalVariables.allSalesmenList
               where toSearch.teamSales > Convert.ToInt32(txtSalesSearch.Text)
               select toSearch;
SearchCheckedListBox.DataSource = viewList.ToList();
SearchCheckedListBox.DisplayMember = "teamName";

проблема, с которой я сталкиваюсь, заключается в том, что название команды отображается более одного раза, если в команде более одного продавца.

как я могу предотвратить повторяющиеся значения флажка?


person Pindo    schedule 19.05.2013    source источник
comment
Я не совсем уверен, что вы хотите сделать здесь?   -  person It'sNotALie.    schedule 19.05.2013
comment
флажок имеет повторяющиеся значения, я не хочу этого. Например, если в команде 1 5 участников, в списке флажков будет отображаться 5 команд 1.   -  person Pindo    schedule 19.05.2013
comment
Вы использовали viewList.ToList.Distinct();   -  person Saravanan    schedule 19.05.2013
comment
@saravanan Не сработает, так как они разные. Также вы забыли вызвать ToList!   -  person It'sNotALie.    schedule 19.05.2013
comment
Попробуйте добавить group toSearch by toSearch.teamName into toSearchGrouped перед выбором, а затем в выборе поставить select toSearchGrouped.Key. Должно сработать.   -  person It'sNotALie.    schedule 19.05.2013
comment
@Pindo: вы должны использовать совокупную сумму (teamSales), а затем сгруппировать по названию команды, чтобы получить точные желаемые результаты.   -  person Saravanan    schedule 19.05.2013
comment
@Pindo: вы можете попробовать что-то вроде этого: stackoverflow.com/questions/6970070/   -  person Saravanan    schedule 19.05.2013


Ответы (2)


Попробуйте использовать Different с компаратором:

var viewList = from toSearch in GlobalVariables.allSalesmenList
           where toSearch.teamSales > Convert.ToInt32(txtSalesSearch.Text)
           select toSearch;


SearchCheckedListBox.DataSource = viewList.Distinct(new TeamComparer()).ToList();
SearchCheckedListBox.DisplayMember = "teamName";

Код компаратора:

    public class TeamComparer : IEqualityComparer<teamDetails>
    {
        public bool Equals(teamDetails x, teamDetails y)
        {
            if (x.teamName == y.teamName) return true;

            return false;
        }

        public int GetHashCode(teamDetails obj)
        {
            if (Object.ReferenceEquals(obj, null)) return 0;

            return obj.teamName.GetHashCode();
        }
    }
person Rafal    schedule 19.05.2013

Вы можете просто использовать это

SearchCheckedListBox.DataSource = viewList.GroupBy(x => x.teamName)
                                          .Select(g => g.First())
                                          .ToList();

Если вы планируете использовать один и тот же трюк более одного раза, вы можете написать метод расширения

public static IEnumerable<T> DistinctBy<T, S>(this IEnumerable<T> list, Func<T, S> selector)
{
    return list.GroupBy(selector).Select(g => g.First());
}

тогда код будет

SearchCheckedListBox.DataSource = viewList.DistinctBy(x => x.teamName).ToList();
person EZI    schedule 19.05.2013