我有2个列表,Planets
和Favorites
。它们包含由空格分隔的多个单词。
我按空格将列表拆分为子列表。
现在我想检查Planets
是否包含来自Favorites
的名称。
但是Planets.Contains()
找不到匹配项。
http://rextester.com/YLOG10363
// Planets List
//
List<string> Planets = new List<string>();
Planets.Add("First Mercury Gray");
Planets.Add("Second Venus Yellow");
Planets.Add("Third Earth Blue");
Planets.Add("Fourth Mars Red");
// Favorites List
//
List<string> Favorites = new List<string>();
Favorites.Add("Venus Hot");
Favorites.Add("Mars Cold");
// Sublists
//
string[] arrPlanets = null;
string[] arrFavorites = null;
List<string> Order = new List<string>();
List<string> Names = new List<string>();
List<string> Colors = new List<string>();
// In each Line of Planets & Favorites Lists, Split by Space
// Add Word to it's Sublist
//
for (int i = 0; i < Planets.Count; i++)
{
// Create Planet Sublists
arrPlanets = Convert.ToString(Planets[i]).Split(' ');
Order.Add(arrPlanets[0]);
Names.Add(arrPlanets[1]);
Colors.Add(arrPlanets[2]);
// Create Favorites Sublist
// Prevent Favorites index from going out of range
if (i < Favorites.Count())
{
arrFavorites = Convert.ToString(Favorites[i]).Split(' ');
// Display Message if Planets List Contains a Name from Favorites
//
if (Planets.Contains(arrFavorites[0]))
{
Console.WriteLine("Favorite Detected.");
}
}
}
答案 0 :(得分:2)
您要完成的内容真的不是很清楚,但是因为您说要查明Planets
是否包含来自Favorites
的任何名称,并且假设名称始终是第一个每个喜欢的词,
var PlanetsHasFavorite = Planets.Any(p => Favorites.Select(f => f.Split(' ')[0]).Any(f => p.Split(' ').Contains(f)));
如果任何Planet与PlanetsHasFavorite
中的名称匹配,则 Favorites
为真。
假设你真的想要获得匹配行星的列表,
var PlanetsAreFavorite = Planets.Where(p => Favorites.Select(f => f.Split(' ')[0]).Any(f => p.Split(' ').Contains(f))).ToList();
答案 1 :(得分:2)
好的,我已经查看了所有答案,您可能也想看看这种可能性,因为它代表了对代码进行最小量的重构:
替换
if (Planets.Contains(arrFavorites[0]))
使用
if (Planets.Any(p => p.Contains(arrFavorites[0])))
性能最差,因为有更好的算法可以检查匹配的术语。但是看看你的代码,它似乎并不是你所追求的最重要的事情。那么,我的方法可能会有意义。
希望有所帮助。
答案 2 :(得分:1)
如果你想看看任何一个星球中是否包含任何收藏夹中的任何单词,那么你只需要将收藏夹拆分为单词,然后查看是否有任何行星包含任何单词。
所以,为了得到所有最喜欢的单词,我们可以这样做:
Planets.ForEach(p =>
{
if (favoriteWords.Any(p.Contains))
{
Console.WriteLine($"One of your favorite planets is: {p}");
}
});
现在,我们可以遍历所有行星,看看我们是否有任何匹配:
Console.WriteLine("These favorite words were matched: ");
Planets.ForEach(p => favoriteWords.Where(p.Contains).ToList().ForEach(Console.WriteLine));
结果是:
或者,如果您只想显示匹配的最喜欢的单词,您可以执行以下操作:
<tr class="tr_clone">
<td>
<select style="width:200px" name="itens[]" class="itemname">
<option value="0"></option>
<option value="1">Item A</option>
<option value="2">Item B</option>
<option value="3">Item C</option>
</td>
答案 3 :(得分:1)
如果您不知道要保留的项目数量,请不要使用数组,并且知道将变量设置为null。 改为使用列表:
List<string> planets = new List<string>();
List<string> favorites = new List<string>();
据说你的代码是完全错误的。 你想要达到的目标是这样的:
List<string> Planets = new List<string>();
Planets.Add("First Mercury Gray");
Planets.Add("Second Venus Yellow");
Planets.Add("Third Earth Blue");
Planets.Add("Fourth Mars Red");
List<string> Favorites = new List<string>();
Favorites.Add("Venus Hot");
Favorites.Add("Mars Cold");
// Unless you need favorites to hold tokens seperated by a white space
// you shouldn't make another list such as this one:
List<string> faveKeywords = Favorites.SelectMany(fave => fave.Split(' ')).ToList();
foreach (var token in from line in Planets from token in line.Split(' ') where faveKeywords.Contains(token) select token)
{
Console.WriteLine($"Favorite detected: {token}" );
}
或者,如果您一直坚持订购,颜色,名称:
foreach (var tokens in Planets.Select(str => str.Split(' ')))
{
Order.Add(tokens[0]);
Names.Add(tokens[1]);
Colors.Add(tokens[2]);
foreach (var token in tokens.Where(token => faveKeywords.Contains(token)))
{
Console.WriteLine($"Favorite detected: {token}");
}
}
你需要从这样的例子中学习并观察比你要求的更多。