Есть ли способ избежать дубликатов в сборщике - PullRequest
1 голос
/ 07 апреля 2019

Я создаю приложение для распечатки книг, которыми я владею и хочу… у этого приложения есть база данных Sqlite. В каждой книге есть строка с идентификаторами столбцов, автором и названием. Моя проблема в том, что, когда я добавляю новую книгу, я хотел дать этому пользователю возможность ввести новое имя автора или получить его от сборщика. Средство выбора ItemsSource поступает из колонки авторов. Моя проблема в том, что у каждого автора может быть более одной книги, имена авторов отображаются несколько раз в окне выбора

Xaml

<StackLayout Orientation="Horizontal">
    <Entry x:Name="authorName" HorizontalOptions="FillAndExpand" Text="{Binding Author}"
       Keyboard="Text" 
       StyleClass="entry"/>

    <StackLayout>
        <Button x:Name="PickAuthor" Text="..." WidthRequest="40"
        Clicked="PickAuthor_Clicked"/>
    </StackLayout>

    <Picker x:Name="ExistingAuthors"
            Title="Select Author"
            IsVisible="False"
            SelectedIndexChanged="ExistingAuthors_SelectedIndexChanged">
        <Picker.ItemDisplayBinding>
            <Binding Path="Author" />
        </Picker.ItemDisplayBinding>
    </Picker>
</StackLayout>

Код позади

protected override async void OnAppearing()
{
    await _connection.CreateTableAsync<WishList>();
    var book = await _connection.Table<WishList>().ToListAsync();
    _book = new ObservableCollection<WishList>(book);
    base.OnAppearing();
}

private void PickAuthor_Clicked(object sender, EventArgs e)
{
    ExistingAuthors.ItemsSource = _book.Distinct().ToList();
    ExistingAuthors.Focus();
}

private void ExistingAuthors_SelectedIndexChanged(object sender, EventArgs e)
{
    authorName.Text = ExistingAuthors.Items[ExistingAuthors.SelectedIndex];
}

Я не хочу, чтобы сборщик заменял дубликаты.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Для удаления дубликатов из списка вы можете использовать Linq.Приведенный ниже метод группирует коллекцию по дублирующему полю и выбирает первую группу.

private void PickAuthor_Clicked(object sender, EventArgs e)
{
    ExistingAuthors.ItemsSource = _book.GroupBy(b => b.Author)    // group by Author
                                       .Select(g => g.First())    // select first group
                                       .ToList();
    ExistingAuthors.Focus();
}

Это вернет список типа вашей сущности.

0 голосов
/ 07 апреля 2019

Если вы только отображаете список авторов, выберите Authors из _book, а затем вызовите Distinct, чтобы удалить повторяющиеся имена авторов.

private void PickAuthor_Clicked(object sender, EventArgs e)
{        
    ExistingAuthors.ItemsSource = _book.Select(x => x.Author.Trim()).Distinct().ToList();
    ExistingAuthors.Focus();
}
...