Как зациклить и сравнить 2 списка, используя лямбда-выражения

1

Скажем, у меня есть класс под названием Features

class Features
{
    public Features()
    {
    }
    public Features(string id, string name)
    {
        this.FeatureID = id; this.FeatureName = name;
    }
    private string featureid;
    private string featurename;
    public string FeatureID
    {
        get { return featureid; }
        set { featureid = value; }
    }
    public string FeatureName
    {
        get { return featurename; }
        set { featurename = value; }
    }
}

Затем я создал 2 списка одного типа:

List<Features> list1 = new List<Features>();
list1.Add(new Features("1111111111", "Feature 1"));
list1.Add(new Features("2222222222", "Feature 2"));
list1.Add(new Features("3333333333", "Feature 3"));
list1.Add(new Features("4444444444", "Feature 4"));
list1.Add(new Features("5555555555", "Feature 5"));

List<Features> list2 = new List<Features>();
list2.Add(new Features("1111111111", "Feature 1"));
list2.Add(new Features("0002222222", "Feature 2"));
list2.Add(new Features("0003333333", "Feature 3"));
list2.Add(new Features("0004444444", "Feature 4"));
list2.Add(new Features("5555555555", "Feature 5"));

Затем я сравнил эти 2 списка с помощью лямбда-выражений следующим образом:

var newList = list1
.Select(
x => (new Features
{
FeatureID = x.FeatureID,
FeatureName = x.FeatureName
}
)
).Where(t=> t.FeatureID == list2.FirstOrDefault().FeatureID ).ToList();

newList.ForEach(t => Console.WriteLine(t.FeatureName));

Пока этот код возвращает только первый идентификатор функций, который соответствует в обоих списках...

Вопрос в том:

Как я могу зацикливаться на обоих списках, используя выражение Lambda? Я пробовал Any и All, но ничего не работает, но FirstOrDefault(), как показано выше.

спасибо большое, оценили.

  • 0
    На самом деле, держу пари, он ничего не возвращает, если ни один из членов list1 соответствует первому члену list2 . Но неясно, какой результат вы на самом деле пытаетесь достичь здесь. Пожалуйста, отредактируйте ваш вопрос так, чтобы в нем четко указывался желаемый результат, и почему это правильный вывод с учетом ввода.
Теги:
lambda

3 ответа

1

Попробуй это

var result= from x1 in list1
            join x2 in list2 on x1.FeatureID  equals x2.FeatureID 
            select x1;
0

Вы в основном ищете Left Join в LINQ: -

var result1 = list1.GroupJoin(list2,
                              l1 => l1.FeatureID,
                              l2 => l2.FeatureID,
                              (x, y) => new { x, y })
                                        .SelectMany(z => z.y.DefaultIfEmpty(),
                                        (a, b) => new
                                        {
                                             FeatureName = b == null ? "Feature don't match" : b.FeatureName
                                        });

Выражение Lamda для левого соединения немного сложное, вы также можете использовать синтаксис запроса:

var result = from l1 in list1
                      join l2 in list2
                      on l1.FeatureID equals l2.FeatureID into allFeatures
                      from finalList in allFeatures.DefaultIfEmpty()
                      select new
                        {
                           FeatureName = finalList == null ? "Feature don't match" : finalList.FeatureName
                        };

Это дает мне этот результат: -

Feature1
Feature don't match
Feature don't match
Feature don't match
Feature5
0

Большое спасибо ребятам !!! Я получил его с помощью выражений :)

var result = list1.Join(list2, t => t.FeatureID, t => t.FeatureID, (x, y) => new
        {
            ID = x.FeatureID,
            Name = x.FeatureName
        }).ToList();
result.ForEach(t => Console.WriteLine(t.Name));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню