Помогите с логикой C # - PullRequest
       0

Помогите с логикой C #

0 голосов
/ 27 октября 2010

Пожалуйста, смотрите мой код ниже, я хочу добавить данные в коллекцию roomBlock таким образом, чтобы для каждого уникального имени в Hotelnm он содержал все записи для этого конкретного названия отеля.Так что, если мой пользовательский интерфейс сначала отображает имя отеля как ABC, то в соответствующем roomBlock будут все записи из result.ResultSet, в котором есть это имя.Как я это сделаю?

Hotelnm - это хэшсет, содержащий уникальные названия отелей.Теперь я хочу отобразить для каждого имени в hashset набор данных для этого конкретного отеля.Например, мой result.ResultSet содержит записи, которые имеют несколько раз название отеля.Поэтому я хочу отобразить один раз это название отеля, а затем все записи с этим названием отеля.Код, который я выделил выше, показывает не все записи для конкретного отеля, а только один раз.

Ответы [ 4 ]

1 голос
/ 28 октября 2010

Первое, что вам нужно сделать, это создать SortedDictionary<string, RoomBlockViewModel>, ключом которого является название отеля.Это можно легко сделать следующим образом:

Dictionary<string, List<RoomBlockViewModel>> hotelRooms = result.resultSet
    .Cast<RoomBlock>()
    .Select(x => new RoomBlockViewModel(x))
    .GroupBy(x => x.HotelName)
    .ToDictionary(x => x.Key, x => x.ToList()); 

Hotels.DataContext = new SortedDictionary<string, List<RoomBlockViewModel>>(hotelRooms);

Предполагается, что RoomBlockViewModel предоставляет свойство HotelName, чтобы вы могли сгруппировать его, и чтобы имена отелей были уникальными.Hotels в этом коде - это ListBox, содержащий отели.

Когда вы привязываетесь к словарю в WPF, вы действительно привязываетесь к IEnumerable<KeyValuePair<TKey, TValue>> - то есть к каждому объекту висточник данных имеет свойства Key и Value, которые в данном случае имеют тип string и List<RoomBlockViewModel>.

. Таким образом, список отелей имеет этот словарь в качестве контекста данных и используетItemTemplate для представления Key (то есть название отеля).И список комнатных блоков имеет ItemsSource, связанный с SelectedItem.Value в списке Hotels, потому что Value содержит List<RoomBlockViewModel>.

<DockPanel>
    <ListBox x:Name="Hotels"
                Margin="5"
                Background="Lavender"
                DockPanel.Dock="Top"
                ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Key}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <ListBox Margin="5"
                Background="AliceBlue"
                ItemsSource="{Binding ElementName=Hotels, Path=SelectedItem.Value}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Info}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

</DockPanel>
1 голос
/ 27 октября 2010

Вы говорите об отношениях мастера / детали (между элементами управления), а ваш код этого не делает. Вы создали «основной список» названий отелей, но вы не зафиксировали детали для каждого отеля в какой-либо структуре данных (что я вижу в вашем примере).

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

// link query to get you a list of distinct hotel names
var hotelNames = result.ResultSet.Select(rb => rb.HotelName).Distinct().ToList();

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

// list of details passed on a hotelname
// the where clause has a variable that represents the hotel name from the SelectedIndex
// in the master list
var hotelDetails = results.ResultSet.Where(rb.HotelName == hotelNameVariable);

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

Или я мог быть совершенно не в курсе. :) Я немного догадался о ваших вопросах и о том, что вы пытаетесь сделать.

1 голос
/ 27 октября 2010
foreach (DomainObject obj in result.ResultSet)
            {
                RoomBlock rmblk = (RoomBlock)obj;

                if (!Hotelnm.Contains(rmblk.HotelName))
                {
                    Hotelnm.Add(rmblk.HotelName);
                    **//roomBlock.Add(new RoomBlockViewModel(rmblk));**
                }

            }

Если ваши записи в результате. ResultSet, то ваш код гарантирует, что вы увидите не более одной записи на отель.

Это потому, что вы написали if (!Hotelnm.Contains(rmblk.HotelName)) до Hotelnm.Add(rmblk.HotelName). При каждой последующей записи в цикле foreach вы гарантированно не добавляете rmblk для того же отеля.

0 голосов
/ 27 октября 2010

Код, который вы выделили, не должен быть внутри условного.Это не уникальные данные.Оно должно быть за пределами условного.

foreach (DomainObject obj in result.ResultSet) 
{ 
    RoomBlock rmblk = (RoomBlock)obj; 

    if (!Hotelnm.Contains(rmblk.HotelName)) 
    { 
        Hotelnm.Add(rmblk.HotelName);
    } 

    roomBlock.Add(new RoomBlockViewModel(rmblk)); 


} 
MainListBox.DataContext = Hotelnm; 

РЕДАКТИРОВАТЬ: я предполагаю, что у вас есть переменная где-то под названием roomBlock, которая используется для хранения этой информации и что она связана с Hotelnm.Если вы хотите добавить это каким-либо образом в Hotelnm, вам нужно будет подключиться к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...