c # сравнить два массива с условиями - PullRequest
2 голосов
/ 25 июля 2011

Если у меня есть два массива

   First: A, B, C
   Second: ?, B, C

Я хочу сравнивать только элементы из второго с элементами из первого, который не содержит вопросительный знак «?».

Так что для такого случая:

   First: A, B, C
   Second: ?, B, C

Я хочу сравнить только элементы 1 и 2, потому что элемент 0 во втором массиве содержит?.

Для этого:

   First: A, B, C
   Second: 2, ?, C

Я хочу сравнить только элементы 0 и 2, поскольку элемент 1 во втором массиве содержит?

Есть идеи, как лучше и с минимальным количеством кода сделать это? Если это потребуется для создания каких-либо списков или любых других коллекций, это нормально.

Ответы [ 4 ]

3 голосов
/ 25 июля 2011

ПОЦЕЛУЙ

for(int i = 0; i < listB.length; i++)
   if(listB[i] != "?")
       compare(listA[i], listB[i]);
2 голосов
/ 25 июля 2011

Использование LINQ не выходя из вашего кресла:

// Input data:
var first = new[] { "A", "B", "?" };
var second = new[] { "?", "B", "C" };

// This actually filters out pairs where either first or second
// is equal to "?". If you only want to filter out pairs where the
// second is "?", adjust accordingly.
var toCompare = first.Zip(second, Tuple.Create)
                     .Where(t => t.Item1 != "?" && t.Item2 != "?");

// And now you have a collection of Tuple<string, string>, which
// can be processed in a multitude of ways:
Console.Out.WriteLine(string.Format(
    "Compared {0} items, and found {1} of them equal.",
    toCompare.Count(),
    toCompare.All(t => t.Item1 == t.Item2) ? "all" : "not all"));            

Обновление:

Если предикат сравнения (метод, который сравнивает пару элементов и возвращаетлогическое значение) будет более сложным, чем приведенное выше, имеет смысл определить его как лямбду (если он не будет использоваться повторно и достаточно короткий) или как правильный метод в противном случае.

ДляНапример, чтобы реализовать то, что упомянуто в комментарии ниже:

Func<Tuple<string, string>, bool> predicate = t =>
    t.Item2 == "?" ||
    t.Item2 == "_" && t.Item1 != string.Empty ||
    t.Item2 == t.Item1;

// And now you have a collection of Tuple<string, string>, which
// can be processed in a multitude of ways:
Console.Out.WriteLine(string.Format(
    "Compared {0} items, and found {1} of them equal.",
    toCompare.Count(),
    toCompare.All(predicate) ? "all" : "not all"));            
1 голос
/ 25 июля 2011
[TestMethod]
public void TestArrayWithConditions()
{
    var First = new [] {"A", "B", "C"};
    var Second = new[] { "?", "B", "C" };
    var Third = new[] { "2", "?", "C" };

    var result12 = CompareWithConditions(First, Second);
    var result13 = CompareWithConditions(First, Third);

    Assert.AreEqual(null, result12[0]);
    Assert.AreEqual(true, result12[1]);
    Assert.AreEqual(true, result12[2]);

    Assert.AreEqual(false, result13[0]);
    Assert.AreEqual(null, result13[1]);
    Assert.AreEqual(true, result13[2]);
}

private static List<bool?> CompareWithConditions(string[] first, string[] second)
{
    var result = new List<bool?>();

    var length = Math.Min(first.Length, second.Length);

    for (int i = 0; i < length; i++)
    {
        if (second[i] == "?")
        {
            result.Add(null);
        }
        else
        {
            result.Add(second[i] == first[i]);
        }
    }

    return result;
}
1 голос
/ 25 июля 2011

Вам нужно что-то, кроме следующего?

for (int ii = 0; ii < second.Length; ii++)
{
    if (second[ii] == "?")
        continue;

    // Else do your compare.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...