2013-04-04 2 views
1

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

У меня есть 2 списка:

public List<int[,]> LongList = new List<int[,]>(); 
public List<int[,]> UniqueList = new List<int[,]>(); 

Для дальнейшего объяснения, вот сценарий:

Пазлы:

public int[,] puzzle1 = new int [3,3] { {1,2,3}, 
              {8,4,0}, 
              {7,6,5} }; //[1,2,3;8,4,0;7,6,5] 

    public int[,] puzzle2 = new int [3,3] { {8,7,6}, 
              {1,0,5}, 
              {2,3,4} }; //[8,7,6;1,0,5;2,3,4] 


    public int[,] puzzle3 = new int [3,3] { {7,6,3}, 
              {1,0,2}, 
              {8,4,5} }; //[7,6,3;1,0,2;8,4,5] 

лонг содержит:

LongList.Add(puzzle1); 
LongList.Add(puzzle1); 
LongList.Add(puzzle1); 
LongList.Add(puzzle1); 
LongList.Add(puzzle2); 
LongList.Add(puzzle2); 
LongList.Add(puzzle3); 
LongList.Add(puzzle3); 
LongList.Add(puzzle3); 

Я хотел Уникальный список удерживайте значения UNIQUE из LongList. как если бы это случилось:

UniqueList.Add(puzzle1); 
UniqueList.Add(puzzle2); 
UniqueList.Add(puzzle3); 

как уравнение: UniqueList = различающиеся значения из лонга

Список полон множество повторяющихся значений & Я хотел бы взять только уникальные из них и поместить их в UniqueList.

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

LongList значения: 1,1,1,1,2,2,3,4,4,4,4,5,5

Я хотел UniqueList к содержат головоломки: 1,2,3,4,5

+1

возможно дубликат: http://stackoverflow.com/questions/4639036/get-distinct-items-from-a-list –

+0

вы можете проверить ответы на этот вопрос, тоже: HTTP://stackoverflow.com/questions/1388361/getting-all-unique-items-in-ac-sharp-list –

+1

@IsmetAlkan это не почти дубликат –

ответ

1

Замечания OP неясны.

Вариант 1: уникальные номера из всех многомерных массивов

List<int> UniqueList = new List<int>(); 

UniqueList = LongList.Select(i => Flatten(i)) 
       .SelectMany(i => i) 
       .Distinct() 
       .ToList(); 

Это будет превратить {[[0, 1], [2, 3]], [[2, 2], [4 , 5]]} в {0, 1, 2, 3, 4, 5}

для Flatten

Вариант 2 см ниже: Уникальные многомерные массивы по значениям

NB: Предполагает размер и количество измерений каждого многомерного массива.

List<int[,]> UniqueList = new List<int[,]>(); 
foreach (var e in LongList) 
{ 
    IEnumerable<int> flat = Flatten(e); 
    if (!UniqueList.Any(i => Flatten(i).SequenceEqual(flat))) 
    { 
    UniqueList.Add(e); 
    } 
} 

Это превратит {[[0, 1], [2, 3]], [[0, 1], [2, 3]], [[2, 2], [4, 5 ]]} до {[[0, 1], [2, 3]], [[2, 2], [4, 5]]}

Смотрите ниже Flatten

Вариант 3: Уникальный ссылки только

UniqueList = aList.Distinct().ToList(); 

NB: Это был оригинальный ответ, для контекста на комментарии.

Flatten Метод

Во всех случаях Flatten берется из Guffa's SO Answer

public static IEnumerable<T> Flatten<T>(T[,] items) { 
    for (int i = 0; i < items.GetLength(0); i++) 
    for (int j = 0; j < items.GetLength(1); j++) 
     yield return items[i, j]; 
} 

Других вариант

Если ОП хотел бы что-то другое (например, flattenting List<int[,]> к List<int[]> или поддержке различные размерные массивы), они должны будут комментарий назад.

+1

Я не думаю, что это сработает с int [,], вы проверили? –

+0

Зависит от вашего определения «уникальный». Я проверил тест в LINQPad, и это соответствовало моей интуиции. Я возьму код и отправлю обратно. –

+1

Я только что проверил, и это не так. –

1

Основываясь на обновлении OP, нам просто нужно удалить дубликаты ссылок. Поэтому нам не нужно сравнивать на основе стоимости. Distinct должны сделать:

UniqueList = LongList.Distinct().ToList(); 
+0

haha ​​мой первый ответ ...Я все равно поддерживаю вас, поскольку я был таким же терпеливым, как и я :-) –

+1

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

+0

Основываясь на своем комментарии, что он содержит несколько ссылок на одну и ту же головоломку, вы звучите так, как будто вы интерпретировали это правильно для меня. –

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