Использование LINQ для поиска значения c в списке - PullRequest
2 голосов
/ 16 апреля 2020

Я пытаюсь использовать LINQ, чтобы найти конкретное c строковое значение "ConstantA" в списке.

Переменная «stuff» - это тип:

List<KeyValuePair<string, string>> 

Первое значение в списке (StuffName) - это то, что я ищу:

enter image description here

Как использовать LINQ для поиска правильного StuffName = "ConstantA"?

Это мой код ниже:

var listOfStuff = CalculateStuff();
foreach (var stuff in listOfStuff)
{
  if (stuff.Constants.FindAll("ConstantA") //**I’m having problem with LINQ here**
  {
   …
  }
}


private static List<Stuff> CalculateStuff()
{
…
}

public class Stuff : IHasIntInst
{
    public List<KeyValuePair<string, string>> Constants { get; set; }
}

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Если вы пытаетесь просто проверить хотя бы один экземпляр ConstantA, просто используйте Any () следующим образом:

if (stuff.Constants.Any(x => x.Key == "ConstantA")
{
    //do something....
}
1 голос
/ 17 апреля 2020

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

1 - Первый подход:

var result = listOfStuff.SelectMany(e => e.Constants.Select(d => d))
                        .Where(e=> e.Key == "ConstantA");

2 - Второй подход:

 var result = from item in listOfStuff.SelectMany(e => e.Constants)
             where item.Key =="ConstantA"
             select item ;
1 голос
/ 16 апреля 2020

С вашей текущей версией кода:

var listOfStuff = CalculateStuff();
foreach (var stuff in listOfStuff)
{
    var items = stuff.Constants.FindAll((keyValuePair) => keyValuePair.Key == "ConstantA");
    if (items.Any())
    {
        //**I’m having problem with LINQ here**
    }
}

В случае, если вы не хотите, чтобы элементы, а только хотите проверить состояние, используйте LINQ Any метод:

foreach (var stuff in listOfStuff)
{
    if (stuff.Constants.Any((keyValuePair) => keyValuePair.Key == "ConstantA"))
    {
        {
            //**I’m having problem with LINQ here**
        }
    }
}

В случае, если ваш класс Stuff определен с использованием Dictionary:

public class Stuff
{
    public Dictionary<string, string> Constants { get; set; }
}

и использованием:

var listOfStuff = CalculateStuff();
foreach (var stuff in listOfStuff)
{
    var items = stuff.Constants.Where((kvp) => kvp.Key == "ConstantA");

    if (items.Any())
    {
        //**I’m having problem with LINQ here**
    }
}

Обратите внимание, что в обоих случаях использование одинаково, что означает, что изменение List<KeyValuePair<string, string>> на Dictionary<string, string> не сильно повлияет на код.


И, наконец, версия, которую я предпочитаю больше всего)
Класс Stuff будет иметь вид:

public class Stuff
{
    public string StuffName { get; set; }
    public int StuffValue { get; set; }
}

Далее, метод вычисления будет:

private static List<Stuff> CalculateStuff()
{
    return new List<Stuff>()
    {
        new Stuff{StuffName = "ConstantA", StuffValue = 100},
        new Stuff{StuffName = "ConstantB",StuffValue = 200}

    };
}

И использование:

var listOfStuff = CalculateStuff().Where(st => 
                                         st.StuffName == "ConstantA");

foreach (var stuff in listOfStuff)
{
    Console.WriteLine($"Name: {stuff.StuffName}, Value: {stuff.StuffValue}");
}
...