Member 10004269 Ответов: 2

Список фильтрации, основанные на дочерний элемент другого списка с#


у меня есть структура, как
public class Categories {
  Public List<categorydescription> LisstOfcategories {get ; set;} 
} 

public class categoryDescription { 
  public string CategoryCode {get ;set;} 
}

И у меня есть список строк, который содержит некоторые категории, такие как
List<string> lst = new List<string>();

lst.Add("CategoryCode1"); 
lst.Add("CategoryCode2");
и список категорий как
List<Categories > lstCategories Now how do i filter lstCategoriessuch that CategoryCode having same value defined in lst collection should not be selected in Linq C# ? How can i filter this ?


Что я уже пробовал:

i want to query through LINQ, i have tried following which does not compile lstCategories= lstCategories.Where(x => lst.Any(y => y != x.categoryDescription.ForEach(z => z.CategoryCode)));

[no name]

таким образом, в основном вы пытаетесь заполнить только" Дистинтные " коды здесь, в вашем целевом объекте?

Member 10004269

Нет я просто хочу удалить CategoryCode из lstCategories которые упоминаются в lst

Member 10004269

Нет я просто хочу удалить Categorycode из lstCategories которые упоминаются в lst

2 Ответов

Рейтинг:
2

Maciej Los

Прежде всего, ваша модель (структура) неверна!

Я бы предложил создать объект категории таким образом:

public class Category
{
	private string sdescription = string.Empty;
	private string scode = string.Empty;

	public Category(string _description)
	{
		sdescription = _description;
	}
	
	public Category(string _description, string _code)
	{
		sdescription = _description;
		scode = _code;
	}
	
	public string Description
	{
		get { return sdescription; }
		set { sdescription = value; }
	}
	
	public string Code
	{
		get { return scode; }
		set { scode = value; }
	}
}


Теперь ваш список может выглядеть так:
List<Category> Categories = new List<Category>()
    {
        new Category("Books", "001"),
        new Category("Cars", "002"),
        new Category("Tools", "003")
    };

И еще один список категорий (CategoryCode):
List<string> lst = new List<string>()
    {
        "Cars",
        "Dogs"
    };


Последний запрос:
var CategoriesNotOnLst = Categories
    .Where(x => !lst.Any(z => x.Description==z))
    .ToList();


Результат:
Description Code
Books       001 
Tools       003 


Member 10004269

Нет я не могу изменить существующую структуру кода

Поэтому я могу дать вам другое объяснение следующим образом

зоопарк общественного класса
{
публичная строка zooName {get ; set;}

публичный список & lt;animaldescriptions> animalDescriptions {get; set;}
}

публичный класс animalDescriptions

{
публичная строка AnimalName {get ; set;}


}

Теперь у нас есть список зоопарка как

Список<зоопарк&ГТ; ZooList = новый список<зоопарк&ГТ;();

var animaldescriptionsObj = new animalDescriptions { AnimalName = " обезьяна"};
var animaldescriptionsObj2 = new animalDescriptions { AnimalName = " тигр"};


zoolist. add({ zooName = "Zoo1", List< animaldescriptions> {animaldescriptionsObj, animaldescriptionsObj 2 }})

И у нас есть другой список строк как
List< string > lst = новый список & lt;string>();
lst. Add ("Лев");
lst. Add ("тигр");



Теперь я хочу запрос linq, чтобы имена животных, определенные в lst, не были выбраны из Zoolist ..так что в результате имя тигра животного должно быть удалено из Zoolist

Рейтинг:
0

Ehsan Sajjad

Вы можете достичь этого следующим образом:

lstCategories.Where(x => lst.Contains(x.CategoryCode));


Richard Deeming

Вопрос сбивает с толку, но я думаю, что ОП хочет, чтобы все было наоборот - вернуть категории, которые не существуют в lst.

Вы также на один уровень выше в иерархии: lstCategories это List<Categories>, но ваш код ожидает, что это будет List<categoryDescription>.

Maciej Los

Кажется, ОП хочет получить список категорий, которые не существуют в строковом списке...
Итак, ваш запрос должен быть: lstCategories.Where(x => !lst.Contains(x.CategoryCode));
+4!

Member 10004269

Нет я не могу изменить существующую структуру кода

Поэтому я могу дать вам другое объяснение следующим образом

зоопарк общественного класса
{
публичная строка zooName {get ; set;}

публичный список & lt;animaldescriptions> animalDescriptions {get; set;}
}

публичный класс animalDescriptions

{
публичная строка AnimalName {get ; set;}


}

Теперь у нас есть список зоопарка как

Список<зоопарк&ГТ; ZooList = новый список<зоопарк&ГТ;();

var animaldescriptionsObj = new animalDescriptions { AnimalName = " обезьяна"};
var animaldescriptionsObj2 = new animalDescriptions { AnimalName = " тигр"};


zoolist. add({ zooName = "Zoo1", List< animaldescriptions> {animaldescriptionsObj, animaldescriptionsObj 2 }})

И у нас есть другой список строк как
List< string > lst = новый список & lt;string>();
lst. Add ("Лев");
lst. Add ("тигр");



Теперь я хочу запрос linq, чтобы имена животных, определенные в lst, не были выбраны из Zoolist ..так что в результате имя тигра животного должно быть удалено из Zoolist