Как я могу получить разницу в двух списках в C #? - PullRequest
11 голосов
/ 23 марта 2012

Хорошо, поэтому у меня есть два списка в C #

List<Attribute> attributes = new List<Attribute>();
List<string> songs = new List<string>();

один из строк и один из объекта атрибута, который я создал .. очень просто

class Attribute
{
    public string size { get; set; }
    public string link { get; set; }
    public string name { get; set; }
    public Attribute(){}
    public Attribute(string s, string l, string n) 
    {
        size = s;
        link = l;
        name = n;
    }
}

я сейчаснужно сравнить, чтобы увидеть, какие песни отсутствуют в имени атрибута, например,

songs.Add("something"); 
songs.Add("another"); 
songs.Add("yet another");

Attribute a = new Attribute("500", "http://google.com", "something" ); 
attributes.Add(a);

Я хочу, чтобы был способ вернуть «другой» и «еще один», потому что их нет в имени списка атрибутов

так для псевдокода

difference = songs - attributes.names

Ответы [ 4 ]

34 голосов
/ 23 марта 2012
var difference = songs.Except(attributes.Select(s=>s.name)).ToList();

редактировать

Добавлен ToList (), чтобы сделать его списком

6 голосов
/ 01 октября 2013

Стоит отметить, что ответы, опубликованные здесь, вернут список songs, отсутствующий в attributes.names, но не даст вам список attributes.names, отсутствующий в songs.

Хотя это то, чего хотел ОП, название может быть немного вводящим в заблуждение, особенно если (как и я) вы пришли сюда в поисках способа проверить, отличается ли содержимое двух списков. Если это то, что вы хотите, вы можете использовать следующее: -

var differences = new HashSet(songs);
differences.SymmetricExceptWith(attributes.Select(a => a.name));
if (differences.Any())
{
    // The lists differ.
}
4 голосов
/ 23 марта 2012

Это способ найти все песни, которые не включены в имена атрибутов:

var result = songs
  .Where(!attributes.Select(a => a.name).ToList().Contains(song));

Ответ с использованием Except также идеален и, вероятно, более эффективен.

РЕДАКТИРОВАТЬ:Этот синтаксис имеет одно преимущество, если вы используете его в LINQ to SQL: он переводится в предикат NOT IN SQL.Except не переводится ни на что в SQL.Таким образом, в этом контексте все записи будут восстановлены из базы данных и исключены на стороне приложения, что гораздо менее эффективно.

4 голосов
/ 23 марта 2012
var diff = songs.Except(attributes.Select(a => a.name)).ToList();
...