将列表拆分为子列表,List.Contains()找不到匹配项

时间:2017-08-09 21:30:20

标签: c# arrays list sorting

我有2个列表,PlanetsFavorites。它们包含由空格分隔的多个单词。

我按空格将列表拆分为子列表。

现在我想检查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.");
        }
    }
}

4 个答案:

答案 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));

结果是:

enter image description here

或者,如果您只想显示匹配的最喜欢的单词,您可以执行以下操作:

<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> 

enter image description here

答案 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}");
    }
}

你需要从这样的例子中学习并观察比你要求的更多。