C# 使用LINQ在列表中查找特定值

C# 使用LINQ在列表中查找特定值,c#,list,linq,keyvaluepair,C#,List,Linq,Keyvaluepair,我尝试使用LINQ在列表中查找特定的字符串值“ConstantA” 变量“stuff”是一种类型: List<KeyValuePair<string, string>> 列表 列表中的第一个值(StuffName)就是我要查找的值: 如何使用LINQ查找正确的StuffName=“ConstantA” 下面是我的代码: var listOfStuff = CalculateStuff(); foreach (var stuff in listOfStuff) {

我尝试使用LINQ在列表中查找特定的字符串值“ConstantA”

变量“stuff”是一种类型:

List<KeyValuePair<string, string>> 
列表
列表中的第一个值(StuffName)就是我要查找的值:

如何使用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; }
}
var listofsuff=CalculateStuff();
foreach(listOfStuff中的var stuff)
{
if(stuff.Constants.FindAll(“ConstantA”)/**我对LINQ有问题**
{
…
}
}
私有静态列表CalculateStuff()
{
…
}
公共类物品:iHasinist
{
公共列表常量{get;set;}
}

使用当前版本的代码:

var listofsuff=CalculateStuff();
foreach(listOfStuff中的var stuff)
{
var items=stuff.Constants.FindAll((keyValuePair)=>keyValuePair.Key==“ConstantA”);
if(items.Any())
{
//**我对林克有意见**
}
}

如果您不想要项目,但只想检查条件,请使用LINQ
Any
方法:

foreach(listOfStuff中的var stuff)
{
if(stuff.Constants.Any((keyValuePair)=>keyValuePair.Key==“ConstantA”))
{
{
//**我对林克有意见**
}
}
}

如果您的
资料
类是使用
字典
定义的:

公共类的东西
{
公共字典常量{get;set;}
}
和用法:

var listofsuff=CalculateStuff();
foreach(listOfStuff中的var stuff)
{
var items=stuff.Constants.Where((kvp)=>kvp.Key==“ConstantA”);
if(items.Any())
{
//**我对林克有意见**
}
}
请注意,对于这两种情况,用法是相同的,这意味着更改
列表
字典
不会影响太多代码


最后是我最喜欢的版本)
Stuff
类将是:

公共类的东西
{
公共字符串StuffName{get;set;}
public int StuffValue{get;set;}
}
接下来,计算方法是:

private static List CalculateStuff()
{
返回新列表()
{
新材料{StuffName=“ConstantA”,StuffValue=100},
新内容{StuffName=“ConstantB”,StuffValue=200}
};
}
和用法:

var listOfStuff=CalculateStuff()。其中(st=>
st.StuffName==“康斯坦塔”);
foreach(listOfStuff中的var stuff)
{
WriteLine($“名称:{stuff.StuffName},值:{stuff.StuffValue}”);
}

如果您尝试只检查至少一个ConstantA实例,则只需使用如下“Any()”:

if (stuff.Constants.Any(x => x.Key == "ConstantA")
{
    //do something....
}

关于提出的问题,我提出了两种不同的方法,都使用Linq,希望您能有所帮助

1-第一次接近:

var result = listOfStuff.SelectMany(e => e.Constants.Select(d => d))
                        .Where(e=> e.Key == "ConstantA");
2秒接近:


您正在尝试获取与“ConstantA”匹配的常量中的所有实例吗?如果是的话,为什么要用“如果”来表示?你只是想在至少有一个ConstantA实例的情况下做些什么吗?请更正sr28,如果发现了一个“ConstantA”实例,那么就做一些具体的事情。我认为这个问题非常容易解决,但很难理解你想要什么。stuff.Constants.Where(c=>c.Key==“ConstantA”)得到所有的常数,这些常数的键叫做“ConstantA”。或者类似的。但可能不是因为这个问题很容易用不同的方式来解释。。例如,代码中不存在“StuffName”。这可能是关键?那就别叫它“玩物名”。因此,我不能这样做,因为在这种情况下,它将更改其他人的代码:(但感谢您的建议。@ichachan,我当然理解,但您可以尝试提出更改建议;)谢谢您的建议,但对于KeyValuePair,我犯了一个错误:“无法隐式地将type‘System.Collections.Generic.List’转换为‘bool’”@ichachan错误是因为您将集合放在if语句中,而您不能这样做,因为
if
语句只接受布尔表达式,这就是为什么我放置items.Any(),因为它返回布尔值。感谢您的建议,我认为这可能会起作用!现在正在做一些测试。
 var result = from item in listOfStuff.SelectMany(e => e.Constants)
             where item.Key =="ConstantA"
             select item ;